Preview

https://youtu.be/k9zzi_xrEK4

??? : 탱커가 트롤인데요?

 


필요한 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);
    }
}

 


읽어주셔서 감사합니다!

궁금한 점이 있다면 댓글로 문의주세요!

+ Recent posts