【发布时间】:2021-08-20 09:17:59
【问题描述】:
所以我尝试制作一款游戏只是为了好玩和学习以备将来使用。所以我在制作敌方NPC时遇到了这个问题。我希望它跟随我或追逐我,但我希望 NPC 只能水平和垂直移动,并且我希望 NPC 也像我的玩家一样在每个图块上移动。
这是它的外观视频 https://www.youtube.com/watch?v=CB_vdt1Z3nA
这是 NPC 脚本
public class ChaseScript : MonoBehaviour
{
public float speed;
private GameObject player;
private Transform player_transform;
void Start()
{
player = GameObject.Find("Player");
}
void Update()
{
player_transform = player.GetComponent<Transform>();
transform.position = Vector3.MoveTowards(transform.position, player_transform.position, speed * Time.deltaTime);
}
}
这是我的播放器控制器
public void InputMove()
{
if (!isMoving)
{
input.x = Input.GetAxisRaw("Horizontal");
input.y = Input.GetAxisRaw("Vertical");
if (input.x != 0) input.y = 0;
if (input != Vector2.zero)
{
playerAnimation.SetParameterValue(animator);
var movePos = transform.position;
movePos.x += input.x;
movePos.y += input.y;
FacingForward.transform.position = movePos;
if (IsWalkable(movePos))
StartCoroutine(Move(movePos));
}
playerAnimation.SetParameterValueisMoving(animator);
}
if (Input.GetKey(KeyCode.LeftShift))
{
moveSpeed = 6f;
animator.speed = 1.5f;
}
else
{
moveSpeed = 4f;
animator.speed = 1f;
}
}
IEnumerator Move(Vector3 movePos)
{
isMoving = true;
while ((movePos - transform.position).sqrMagnitude > Mathf.Epsilon)
{
transform.position = Vector3.MoveTowards(transform.position, movePos, moveSpeed * Time.deltaTime);
yield return null;
}
transform.position = movePos;
isMoving = false;
}
private bool IsWalkable(Vector3 movePos)
{
if (Physics2D.OverlapCircle(movePos, 0.1f, SolidObjectLayer | NPC) != null)
{
return false;
}
return true;
}
我对我的玩家所做的移动每个图块是我只是添加 1 来变换,所以这将是一个持续的移动,但我不知道如何使用 Vector3.MoveTowards 将它应用到 NPC 但如果不是可以做就可以了
【问题讨论】:
-
能否请您也包含播放器的移动脚本?
-
好的,请稍等
-
好的,我加了。
-
也许你可以让 NPC 模仿玩家的动作。我建议阅读命令模式en.wikipedia.org/wiki/Command_pattern
-
这可能是个好主意。我会试试的。