无法通过脚本获取GameObject的子级

时间:2018-11-12 22:03:30

标签: unity3d

我想访问我的玩家角色的动画师组件。角色是在GameObject Character position下生成的,它本身是Game Manager的子级。

角色预制件有多种名称,因此我无法通过确切名称找到它们。因此,更容易获得Character position的唯一子代。

Game Manager
  Character position
    Player Prefab

我已经在线搜索并按索引和GetChild尝试了GetComponentInChildren。他们都不工作。下面是我为此编写的脚本:

    private Animator archerAnimator;
    private float startSpeed;

    GameObject charPos;
    GameObject archer_;
    // Use this for initialization
    void Start () {
        charPos = GameObject.Find("Game manager/Character position");
        Debug.Log(charPos);
        archer_ = charPos.transform.GetChild(0).gameObject;
        archerAnimator = charPos.GetComponentInChildren<Animator>();
        Debug.Log(archerAnimator);
    }
找到

charPos,但是对于archer_,我得到了错误,Transform child out of bounds。播放器弓箭手不在那儿,但是在场景开始时会在运行时生成,这是它无法如此迅速找到它的原因吗?

一些指导将不胜感激。

谢谢

1 个答案:

答案 0 :(得分:1)

我认为您过早扫描播放器。您应该颠倒发现逻辑。除了扫描播放器及其动画器外,您还应该在播放器本身上放一个脚本,该脚本在创建后运行,并向游戏管理器或需要访问该对象的对象报告自己,就像这样:

void Start() { GetComponentInParent<GameManager>().OnPlayerSpawned(this); }

我还要提到一些脚本,通过名称查找对象并访问其组件通常是一个坏主意。这是一个始终牢记的设计准则:您应该尽可能少地遍历Unity的对象层次结构,即使这样做,也应仅遍历没有附加其他脚本的对象。在这种情况下,您还应该在Player脚本中放入控制Animator的逻辑。然后,您无需首先获得对Animator的引用。