Ara*_*ash 4 c# unity-game-engine
我正在尝试创建一个徘徊的AI
我正在使用统一标准资产第三人称AI
但是问题是AI只是移动到了某个点而不能
在这些点之间巡逻
这是代码?
我该如何修改才能进行巡逻?
使用系统;
使用UnityEngine;
命名空间UnityStandardAssets.Characters.ThirdPerson
{
[RequireComponent(typeof(UnityEngine.AI.NavMeshAgent))]
[RequireComponent(typeof(ThirdPersonCharacter))]
公共类AICharacterControl:MonoBehaviour
{
公共UnityEngine.AI.NavMeshAgent代理{ 私人套装;} //路径查找所需的navmesh代理
公共ThirdPersonCharacter字符{get; 私人套装;} //我们正在控制的字符
公共转换目标;//要瞄准的目标
私有void Start()
{
//获取我们需要的对象上的组件(由于需要组件,因此不应为null,因此无需检查)
代理= GetComponentInChildren();
字符= GetComponent();
agent.updateRotation = false;
agent.updatePosition = true;
}
私人无效Update()
{
如果(目标!=空)
agent.SetDestination(target.position);
如果(agent.remainingDistance> agent.stoppingDistance)
character.Move(agent.desiredVelocity,false,false);
其他
character.Move(Vector3.zero,false,false);
}
公共无效SetTarget(转换目标)
{
this.target =目标;
}
}
}
要在两点之间进行AI巡逻,您需要定义第二点,并更改AI的行为以在到达第一点时更改目标。当前,一旦达到目标(即停止),它只会以零速度运动。
无需过多修改代码,您可以通过执行以下操作将其扩展为在两个位置之间移动。
using System;
using UnityEngine;
namespace UnityStandardAssets.Characters.ThirdPerson
{
[RequireComponent(typeof (UnityEngine.AI.NavMeshAgent))]
[RequireComponent(typeof (ThirdPersonCharacter))]
public class AICharacterControl : MonoBehaviour
{
public UnityEngine.AI.NavMeshAgent agent { get; private set; } // the navmesh agent required for the path finding
public ThirdPersonCharacter character { get; private set; } // the character we are controlling
public Transform start;
public Transform end;
private Transform target;
private boolean forward = true;
private void Start()
{
// get the components on the object we need ( should not be null due to require component so no need to check )
agent = GetComponentInChildren<UnityEngine.AI.NavMeshAgent>();
character = GetComponent<ThirdPersonCharacter>();
agent.updateRotation = false;
agent.updatePosition = true;
}
private void Update()
{
if (target != null)
agent.SetDestination(target.position);
if (agent.remainingDistance > agent.stoppingDistance)
{
character.Move(agent.desiredVelocity, false, false);
}
else
{
SetTarget(forward ? start : end);
forward = !forward;
}
}
public void SetTarget(Transform target)
{
this.target = target;
}
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我修改了,Update()以告知AI如果目标离当前目标太近,就更改目标。start在顶部还需要设置一个额外的Transform定义(),并boolean用于存储AI的前进方向。
该代码尚未在Unity中进行测试,因此可能需要进行一些修改,但它应该为您提供正确的想法。