【问题标题】:Unity3D NavMashAgent not moving -C# CodeUnity3D NavMashAgent 不移动 -C# 代码
【发布时间】:2015-10-05 03:07:12
【问题描述】:

我不知道这是一个合适的地方问这个问题。因为这是一个游戏开发相关的问题。我在这里(gamedev.stackexchange.com -https://gamedev.stackexchange.com/questions/109190/navmashagent-not-moving)发布了这个问题,但仍然没有回应。并在 Unity 论坛 (http://answers.unity3d.com/questions/1075904/navmashagent-not-moving-in-unity3d-5.html) 上发帖。任何人都可以帮助我。

我会再次在这里发布我的问题

我正在尝试将 Cube 移动到 CheckPoints。 FindClosestTarget() 方法给出最近的检查点。当 Cube 击中 CheckPoint 时,ChackPoint 将被设置为非活动状态。当发生碰撞时,再次调用 FindClosestTarget() 并获取新的最近检查点。事情是立方体不动。它看着最近的检查点但不动。

using UnityEngine;
using System.Collections;

public class EnimyAI03N : MonoBehaviour {

    NavMeshAgent agent;
    Transform Target;
    private float rotationSpeed=15.0f;

    void Start () {
        agent = GetComponent<NavMeshAgent>();
        Target = FindClosestTarget ().transform;
    }

    void Update () 
    {
        LookAt (Target);
        MoveTo (Target);

    }

    // Turn to face the player.
    void  LookAt (Transform T){
        // Rotate to look at player.
        Quaternion rotation= Quaternion.LookRotation(T.position - transform.position);

        transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime*rotationSpeed);
        //transform.LookAt(Target); alternate way to track player replaces both lines above.

    }

    void  MoveTo (Transform T){
        agent.SetDestination(T.position); 
    }

    void OnCollisionEnter (Collision col)
    {

        if(col.gameObject.name.Contains("CheckPoint"))
        {
            Target = FindClosestTarget ().transform;
        }
    }

    GameObject FindClosestTarget() {
        GameObject[] gos;
        gos = GameObject.FindGameObjectsWithTag("CheckPoint");

        GameObject closest=null;
        float distance = Mathf.Infinity;
        Vector3 position = transform.position;
        foreach (GameObject go in gos) {
            Vector3 diff = go.transform.position - position;
            float curDistance = diff.sqrMagnitude;

            if (curDistance < distance) {
                closest = go;
                distance = curDistance;
            }
        }
        return closest;
    }

}

【问题讨论】:

  • 您只需要检查和循环通过活动的检查点!
  • 活动检查点由 FindClosestTarget() 自动收集。我正在使用 unity3d 5

标签: c# unity3d navmesh


【解决方案1】:

确保SetActive(false); 在您搜索新目标之前发生,只需将两条线放在同一区域即可。

void OnCollisionEnter (Collision col)
{
    if(col.gameObject.name.Contains("CheckPoint"))
    {
        col.gameObject.SetActive(false);
        Target = FindClosestTarget ().transform;
    }
}

【讨论】:

    猜你喜欢
    • 2015-05-01
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多