首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法通过脚本获取GameObject的子级

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

Stack Overflow用户
提问于 2018-11-12 22:03:29
回答 1查看 88关注 0票数 0

我想访问我的玩家角色的动画组件。这个字符是在GameObject Character position下生成的,它本身就是Game Manager的子代。

角色预制板有不同的名字,所以我无法通过确切的名字找到它们。因此,只需要一个Character position的独生子就更容易了。

代码语言:javascript
复制
Game Manager
  Character position
    Player Prefab

我在网上搜索过,并尝试了GetChild的索引和GetComponentInChildren。他们都不管用。下面是我为此编写的脚本:

代码语言:javascript
复制
    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。玩家弓箭手不在那里,而是在场景开始时在运行时产生的,这就是为什么它找不到它的原因吗?

如能提供一些指导,将不胜感激。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-13 03:42:32

我觉得你找那个球员太早了。你应该颠倒你的发现逻辑。与其扫描播放机及其动画器,不如将脚本放在播放器本身上,该脚本在创建后运行,并向游戏管理器或任何需要访问的对象报告,如下所示:

代码语言:javascript
复制
void Start() { GetComponentInParent<GameManager>().OnPlayerSpawned(this); }

我还将提到,一些脚本通过名称查找对象并访问其组件通常是个坏主意。这里有一个设计准则要记住:您应该尽可能不频繁地遍历统一的对象层次结构,即使您这样做了,也应该只遍历没有附加其他脚本的对象。在这种情况下,您还应该将控制动画器的逻辑放在Player脚本中。那么,你就不需要从一开始就得到动画家的参考了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53270760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档