为什么在我的团结项目中,追逐部分不起作用?

时间:2016-07-20 11:49:23

标签: unity3d unityscript unity5

有人可以下载并查看我的项目吗?这很简单,但不像教程那样有效。

在我的项目中,我在其中一个字符的IsTriggerThirdPersonController中将AIThirdPersonController设置为true。这使角色从平面上掉下来。

我还更改了其中一个要标记为Player的字符,并将状态从PATROL更改为CHASE,但这一切都没有改变。其他玩家永远不会追逐/跟随我控制和移动的玩家。

当我在项目中将IsTrigger设置为true时,为什么玩家会摔倒?

我在视频中看到教练正在使用迷宫飞机。这是我应该在资产中导入的包还是已经在资产中的某个地方了?我刚刚添加了普通飞机,因为我找不到迷宫飞机。

这是我的OneDrive项目的链接。文件名是Demo AI.rar

Project in OneDrive

以下是我试图关注的视频教程的链接。我认为这很简单:

Tutorial

以下是我在项目中使用的BasicAi类,与教程视频中的相同脚本:

using System.Collections;
using UnityStandardAssets.Characters.ThirdPerson;

public class BasicAi : MonoBehaviour {

    public NavMeshAgent agent;
    public ThirdPersonCharacter character;

    public enum State {

        PATROL,
        CHASE
    }

    public State state;
    private bool alive;

    // Variables for patrolling
    public GameObject[] waypoints;
    private int waypointInd = 0;
    public float patrolSpeed = 0.5f;


    // Variable for chasing
    public float chaseSpeed = 1f;
    public GameObject target;


    // Use this for initialization
    void Start () {

        agent = GetComponent<NavMeshAgent> ();
        character = GetComponent<ThirdPersonCharacter>();

        agent.updatePosition = true;
        agent.updateRotation = false;

        state = BasicAi.State.PATROL;

        alive = true;

        StartCoroutine ("FSM");

    }

    IEnumerator FSM()
    {
        while (alive)
        {
            switch (state)
            {

            case State.PATROL:
                Patrol ();
                break;
            case State.CHASE:
                Chase ();
                break;
            }
            yield return null;
        }
    }

    void Patrol()
    {
        agent.speed = patrolSpeed;

        if (Vector3.Distance (this.transform.position, waypoints [waypointInd].transform.position) >= 2) {

            agent.SetDestination (waypoints [waypointInd].transform.position);
            character.Move (agent.desiredVelocity, false, false);
        } else if (Vector3.Distance (this.transform.position, waypoints [waypointInd].transform.position) <= 2) {
            waypointInd += 1;
            if (waypointInd > waypoints.Length) {
                waypointInd = 0;
            }
        } 
        else 
        {
            character.Move (Vector3.zero, false, false);
        }
    }

    void Chase()
    {
        agent.speed = chaseSpeed;
        agent.SetDestination (target.transform.position);
        character.Move (agent.desiredVelocity, false, false);
    }

    void OnTriggerEnter(Collider coll)
    {
        if (coll.tag == "Player") 
        {
            state = BasicAi.State.CHASE;
            target = coll.gameObject;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

一旦碰撞器成为触发器,它就不再与物体发生碰撞,最好的办法是放置一个具有碰撞器并将其设置为触发器的子物体,这样原始碰撞器仍然会与地面碰撞。

至于你的另一个问题,你如何引用你的第三人称角色,你是将它从场景拖到检查器中,还必须将导航网格烘焙到你的场景中。我没有看过你的项目,因为这需要花费很多时间,但可能会再次阅读教程,看看他们如何引用这个角色。使用内置字符,您通常必须首先访问命名空间。