Unity3D -多个敌人在同一脚本中巡逻多条路径

rsl1atfo  于 2023-05-01  发布在  其他
关注(0)|答案(2)|浏览(205)

我是写代码的新手。敌人将在两条路径之间巡逻。然后当玩家进入敌人周围的探测区域时,它会跟随玩家。
如果我想要一个以上的敌人和多条路径,我该如何添加到这个代码中才能做到这一点。给每个敌人都写一个剧本,是不是太浪费了?

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);
        }
    }
}
zbdgwd5y

zbdgwd5y1#

这段代码应该进入敌人的游戏对象,对吧?一种方法是把所有想要的路径放在一个数组中,按照敌人应该遵循的顺序。

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]);
        }
    }

因此,您可以将此脚本添加到场景中的所有敌人游戏对象,然后在编辑器中,您可以手动将其路径变量设置为您希望的任何路径,并且它们应该遵循其设置例程。

vvppvyoh

vvppvyoh2#

在这里,您可以通过航点进行此操作。假设有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);
}

相关问题