Preview
필요한 Script
- Player
- Watcher
Player
필요한 Component;
- Sprite Renderer
- Rigidbody 2D : Body Type(Dynamic), Constrains(Freeze Rotation Z)
- Player(Script) : 하단 참조.
using UnityEngine;
public class Player : MonoBehaviour
{
private Rigidbody2D rb;
private float speed;
private float vel_damp;
private Vector2 acc_direction;
private void Awake()
{
GetReferences();
InitFields();
}
private void GetReferences()
{
rb = GetComponent<Rigidbody2D>();
}
private void InitFields()
{
speed = 100;
vel_damp = 0.75f;
acc_direction = Vector2.zero;
}
private void FixedUpdate()
{
AdjustMovement();
}
private void AdjustMovement()
{
rb.linearVelocity += acc_direction * speed * Time.fixedDeltaTime;
rb.linearVelocity *= vel_damp;
}
private void Update()
{
Move();
}
private void Move()
{
acc_direction = Vector2.zero;
if (Input.GetKey(KeyCode.RightArrow)) acc_direction += Vector2.right;
if (Input.GetKey(KeyCode.LeftArrow)) acc_direction += Vector2.left;
if (Input.GetKey(KeyCode.UpArrow)) acc_direction += Vector2.up;
if (Input.GetKey(KeyCode.DownArrow)) acc_direction += Vector2.down;
acc_direction = acc_direction.normalized;
}
}
Watcher
필요한 Component;
- Sprite Renderer
- Watcher(Script) : 하단 참조.
using UnityEngine;
public class Watcher : MonoBehaviour
{
private Player player;
private float fov;
private float detecting_distance;
private float rotation_speed;
private void Awake()
{
GetReferences();
InitFields();
}
private void GetReferences()
{
player = FindFirstObjectByType<Player>();
}
private void InitFields()
{
fov = 90f;
detecting_distance = 3.5f;
rotation_speed = 50f;
}
private void FixedUpdate()
{
TurnHead();
}
private void TurnHead()
{
// False Conditions
if (Vector2.Distance(transform.position, player.transform.position) > detecting_distance) return;
Vector2 current_direction = transform.right;
Vector2 target_direction = (player.transform.position - transform.position).normalized;
float angle_difference = Vector2.SignedAngle(current_direction, target_direction);
if (Mathf.Abs(angle_difference) > fov / 2f) return;
if (Mathf.Abs(angle_difference) <= rotation_speed * Time.fixedDeltaTime) return;
// If True
transform.Rotate(0, 0, Mathf.Sign(angle_difference) * rotation_speed * Time.fixedDeltaTime);
}
}