我正在制作一个游戏,当玩家触摸它时,游戏对象会跟随第一个对象,而第二个对象会跟随第一个对象。每个物体都跟随它前面的物体,形成一条链,玩家引领这条链。
这是我到目前为止所拥有的
public class ChickenManager : MonoBehaviour
{
Transform player;
bool shouldFollow;
int chickenOrder = 0;
[SerializeField] NavMeshAgent navMeshAgent;
private List<GameObject> chickenList = new List<GameObject>();
// Start is called before the first frame update
void Start()
{
player = GameObject.FindGameObjectWithTag("Player").transform;
navMeshAgent = GetComponent<NavMeshAgent>();
}
// Update is called once per frame
void Update()
{
if (shouldFollow) FollowTarget();
}
private void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.CompareTag("Player"))
{
chickenList.Add(gameObject);
shouldFollow = true;
}
}
void FollowTarget()
{
Quaternion targetRotation = Quaternion.LookRotation(player.position - transform.position);
if (chickenOrder == 0)
{
Vector3 newPosition = player.transform.position - new Vector3(0f,0f,0.5f) ;
navMeshAgent.SetDestination(newPosition);
}
else
{
Vector3 newPosition = chickenList[chickenOrder - 1].transform.position - new Vector3(0f, 0f, 0.5f);
navMeshAgent.SetDestination(newPosition);
}
}
}
现在,当玩家击中游戏对象时,它会跟随玩家但不会留在队列中,而是围绕玩家,我该如何修复它?
提前谢谢您。
假设您在 3D 空间中执行此操作,您的第一个问题是您要从目标位置中减去
new Vector3(0f, 0f, 0.5f)
,因此它始终处于相同的位置,因为您有一个静态偏移量,所以您需要什么是一个相对偏移量,如下所示:
var chicken = chickenList[chickenOrder - 1]; //Added this to make it easier to read
var distanceToFollowBehind = 0.5f;
chicken.transform.position = chicken.transform.position - (chicken.transform.forward * distanceToFollowBehind);
这将获得目标相对于其前进方向后面的位置,因此它始终位于目标后面。
它们包围玩家的原因(我猜)是因为导航网格代理之间的距离非常小,并且它们都试图占据一个小空间并最终聚集在一起。