C# 如何使NPC仅垂直和水平移动,而不使用矢量2/3进行对角线移动。如何使NPC仅通过平铺移动
所以我试着做一个游戏只是为了好玩,为了将来的使用而学习。所以我在制作敌人NPC时遇到了这个问题。我希望它跟随我或追逐我,但我希望NPC只在水平和垂直方向移动,我希望NPC也能像我的玩家一样在每个瓷砖上移动 下面是它的外观视频 这是NPC脚本C# 如何使NPC仅垂直和水平移动,而不使用矢量2/3进行对角线移动。如何使NPC仅通过平铺移动,c#,unity3d,2d-games,C#,Unity3d,2d Games,所以我试着做一个游戏只是为了好玩,为了将来的使用而学习。所以我在制作敌人NPC时遇到了这个问题。我希望它跟随我或追逐我,但我希望NPC只在水平和垂直方向移动,我希望NPC也能像我的玩家一样在每个瓷砖上移动 下面是它的外观视频 这是NPC脚本 public class ChaseScript : MonoBehaviour { public float speed; private GameObject player; private Transform player_t
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);
}
}
我对我的玩家所做的每片移动是我只添加了1以进行变换,所以这将是一个持续的移动,但我不知道如何将其应用到带有矢量的NPC上3。移动方向,但如果不可能,则可以检查这是否可行(您可以将其调整到2D情况)
使用UnityEngine;
公共类脚本:MonoBehavior
{
公众浮标速度;
私人游戏对象玩家;
私有变换;
bool isMoving=false;
void Start()
{
player=GameObject.Find(“player”);
player_transform=player.GetComponent();
变换。注视(玩家的变换位置);
}
无效更新()
{
if(transform.InverseTransformPoint(player_transform.position).z>0){
transform.position+=transform.forward*速度*时间.deltaTime;
isMoving=真;
}否则{
如果(正在移动){
浮动角度=矢量3.角度(transform.forward,player_transform.position-transform.position);
变换.旋转(矢量3.up,数学符号(角度)*90);
isMoving=假;
}else if(transform.InverseTransformPoint(player_transform.position).z你能把你的玩家的动作脚本也包括进来吗?好的,只是一个重要的问题。我添加了它。也许你可以让NPC模拟玩家的动作。我建议阅读命令模式,这可能是个好主意。我会试试。这是glitchingI不知道你场景中的yout元素的轴。这个例子是新3D中的两个立方体投影以在水平面上实现您想要的移动。您可以将其作为参考,使其适应您的具体情况。好的,谢谢,我会尝试您可以使用2个立方体进行检查,命名1个“玩家”,并在场景中移动它以检查正交跟随
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;
}
using UnityEngine;
public class ChaseOrthoScript : MonoBehaviour
{
public float speed;
private GameObject player;
private Transform player_transform;
bool isMoving = false;
void Start()
{
player = GameObject.Find("Player");
player_transform = player.GetComponent<Transform>();
transform.LookAt(player_transform.position);
}
void Update()
{
if (transform.InverseTransformPoint(player_transform.position).z > 0) {
transform.position += transform.forward * speed * Time.deltaTime;
isMoving = true;
} else {
if (isMoving) {
float angle = Vector3.Angle(transform.forward, player_transform.position - transform.position);
transform.Rotate(Vector3.up, Mathf.Sign(angle) * 90);
isMoving = false;
} else if (transform.InverseTransformPoint(player_transform.position).z <= 0) { //player is back
transform.Rotate(Vector3.up, 180);
}
}
}
}