【问题标题】:How do I access a prefab and all of its instantiated clones in c# and unity?如何在 c# 和 unity 中访问预制件及其所有实例化的克隆?
【发布时间】:2020-05-29 22:24:11
【问题描述】:

我需要一点帮助。我目前正在研究通电,它的设置是为了使通电影响放入其预制槽的预制件,所以这意味着它目前只影响一个对象(在我的情况下,敌人)。游戏开始时,我生成了大约 20 个敌人,如果我拾取通电,我希望它影响所有生成的敌人,而不仅仅是拖到脚本上的那个,请问有人有解决方案或替代方法吗?

【问题讨论】:

  • 开机时你的代码到底做了什么?您的所有敌人是否具有相同的统计数据还是取决于敌人?你能展示一些你想改变的代码和部分吗?
  • 我正在使用 Vector2.MoveTowards() 来移动它们,并且我有一个速度变量来修改它们的移动速度,因此我希望将所有敌人的速度设置为固定值。 (每个敌人的速度应该减少或增加相同的数量,所以是的,他们的统计数据将完全相同。
  • 那么你也可以将速度变量设为静态,这样就可以使用相同的速度变量了。

标签: c# unity3d


【解决方案1】:

当实例化它们时将它们存储在一个列表中,然后遍历所有并更新它们的值

在你的情况下,例如

// if enemies have a certain Component rather use that type here instead of GameObject
public GameObject enemyPrefab;
// and use the same type here instead of GameObject
private List<GameObject> enemyInstances = new List<GameObject> enemyInstances;

private void Start()
{
    for(int i = 0; i < 20; i++)
    {
        var newEnemy = Instantiate(enemyPrefab);
        enemyInstances.Add(newEnemy);
    }
}

后来

public void UpdateEnemies()
{
    foreach(var enemy in enemyInstances)
    {
        // skip already destroyed objects
        if(!enemy) continue;

        // whatever to be done to the enemies
    }
}

【讨论】:

    【解决方案2】:

    要将所有游戏对象放到一个数组中,您可以使用Tag

    只需在预制件中添加一个“敌人”标签并使用以下代码:

    public GameObject[] enemys;
    
    void Start()
        {
            respawns = GameObject.FindGameObjectsWithTag("Enemy");
        }
    

    完整的 Unity 文档HERE

    【讨论】:

    • 非常感谢,我现在就试试这个
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    相关资源
    最近更新 更多