我是写代码的新手。敌人会在两条路径之间巡逻。然后当玩家进入敌人周围的探测区域时它会跟随玩家。
如果我想要超过 1 个敌人和多条路径,我将如何添加到这段代码中才能做到这一点。为每个敌人创建一个脚本是一种浪费,对吗?
public var enemyPath1 : Transform;
public var enemyPath2 : Transform;
private var target : Transform = null;
private var characterControls: CharacterController;
function Start ()
{
SetTarget(enemyPath1);
characterControls = GetComponent(CharacterController);
}
function SetTarget(newTarget : Transform) : void
{
target = newTarget;
}
function Update() : void
{
var lookAtPosition : Vector3 = Vector3(target.position.x,
this.transform.position.y,
target.position.z);
transform.LookAt(lookAtPosition);
characterControls.SimpleMove(transform.forward);
}
function OnTriggerEnter(node : Collider) : void
{
if(node.transform == target)
{
if(target == enemyPath1)
{
SetTarget(enemyPath2);
}
else if(target == enemyPath2)
{
SetTarget(enemyPath1);
}
}
}
这段代码应该进入敌人的游戏对象,对吧? 一种方法是将所有需要的路径放在一个数组中,按照敌人应该遵循的顺序排列。
var paths : Transform[];
var pathIndex : int = 0;
// Then in your start function:
function Start ()
{
SetTarget(paths[pathIndex]);
characterControls = GetComponent(CharacterController);
}
// Then in the function that is doing the checking and looking for the next path
function OnTriggerEnter(node : Collider) : void
{
if(node.transform == target)
{
// Increment the index so it looks for the next path object
pathIndex += 1;
if(pathIndex == paths.length)
{
// Resets to the first path if this is the last one
pathIndex = 0;
}
SetTarget(paths[pathIndex]);
}
}
因此,您可以将此脚本添加到场景中的所有敌方游戏对象,然后在编辑器中,您可以手动将它们的路径变量设置为所需顺序的任何路径,并且它们应该遵循它们的设置例程。
在这里你可以通过航点来做到这一点。假设有 3 个航路点,那么敌人会先去第一个,然后是第二个,然后是第三个,然后是第一个..... 如此循环重复。在接下来的代码中,您可以使用光线投射来检测玩家
[SerializeField] private GameObject[] wayPoints;
[SerializeField] private float speed = 2f;
private int currentWayPointIndex = 0;
private void Update()
{
if (Vector2.Distance(wayPoints[currentWayPointIndex].transform.position, transform.position) < 0.2f)
{
currentWayPointIndex++;
if (currentWayPointIndex >= wayPoints.Length)
{
currentWayPointIndex = 0;
}
FlipTransform();
}
transform.position = Vector2.MoveTowards(transform.position, wayPoints[currentWayPointIndex].transform.position,
Time.deltaTime * speed);
}