2025-04-08 11:31:35 +08:00

101 lines
2.6 KiB
C#

using System.Collections;
using UnityEngine;
public class NPC : MonoBehaviour
{
public bool ismoving;
public PlayerManager PlayerManager;
public float velocityX;
public float velocityY;
public Collider2D[] CollidersToDisableOnWalk;
public bool AnimateAutomatically;
public bool FinishedMoveTo;
private Vector2 pos;
public Animator NPCAnimator;
public Coroutine CurrentWalkRoutine;
[Header("Range : -1 to 1")]
public float DefaultStandDirectionX;
public float DefaultStandDirectionY;
private void Start()
{
NPCAnimator.SetFloat("MOVEMENTX", DefaultStandDirectionX);
NPCAnimator.SetFloat("MOVEMENTY", DefaultStandDirectionY);
}
private void Update()
{
Animate();
}
public void WalkToPosition(Vector3 TargetPosition, float Speed)
{
if (CurrentWalkRoutine != null)
{
StopCoroutine(CurrentWalkRoutine);
}
CurrentWalkRoutine = StartCoroutine(WalkTo(TargetPosition, Speed));
}
public void RotateNPC(Vector2 Dir)
{
NPCAnimator.SetFloat("MOVEMENTX", Dir.x);
NPCAnimator.SetFloat("MOVEMENTY", Dir.y);
}
private IEnumerator WalkTo(Vector3 TargetPosition, float Speed)
{
ismoving = true;
while ((TargetPosition - base.transform.position).sqrMagnitude > Mathf.Epsilon)
{
base.transform.position = Vector3.MoveTowards(base.transform.position, TargetPosition, Speed * Time.deltaTime);
yield return null;
CalculateVelocity();
}
FinishedMoveTo = true;
ismoving = false;
CurrentWalkRoutine = null;
}
private void CalculateVelocity()
{
velocityX = (base.transform.position.x - pos.x) / Time.deltaTime;
velocityY = (base.transform.position.y - pos.y) / Time.deltaTime;
pos = base.transform.position;
}
private void Animate()
{
if (AnimateAutomatically)
{
NPCAnimator.SetBool("MOVING", ismoving);
}
if (ismoving && AnimateAutomatically)
{
NPCAnimator.SetFloat("MOVEMENTX", velocityX);
NPCAnimator.SetFloat("MOVEMENTY", velocityY);
}
Collider2D[] collidersToDisableOnWalk = CollidersToDisableOnWalk;
for (int i = 0; i < collidersToDisableOnWalk.Length; i++)
{
collidersToDisableOnWalk[i].enabled = !ismoving;
}
}
public void PlayAnimation(string AnimationName)
{
NPCAnimator.Play(AnimationName);
}
}