为什么在我的统一项目中追逐部分不起作用?

问题描述 投票:0回答:1

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

在我的项目中,我将其中一个字符的

IsTrigger
ThirdPersonController
中的
AIThirdPersonController
设置为 true。这会使角色从飞机上掉下来。

我还更改了其中一个被标记为

Player
的字符,并将状态从
PATROL
更改为
CHASE
但这没有任何改变。其他玩家永远不会追逐/跟随我控制和移动的玩家。

当我在项目中将

IsTrigger
设置为 true 时,为什么玩家会摔倒?

我在视频中看到教练正在使用迷宫飞机。这是我应该在资产中导入的包还是它已经在资产中的某个位置?我现在只是添加了常规飞机,因为我找不到迷宫飞机。

这是我的 OneDrive 中我的项目的链接。文件名为 Demo

AI.rar
:

OneDrive 中的项目

这是我尝试遵循的视频教程的链接。我想这应该很简单:

教程

这是我在项目中使用的

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;
        }
    }
}
c# unity-game-engine
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.