我想访问我的玩家角色的动画师组件。角色是在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
。播放器弓箭手不在那儿,但是在场景开始时会在运行时生成,这是它无法如此迅速找到它的原因吗?
一些指导将不胜感激。
谢谢
答案 0 :(得分:1)
我认为您过早扫描播放器。您应该颠倒发现逻辑。除了扫描播放器及其动画器外,您还应该在播放器本身上放一个脚本,该脚本在创建后运行,并向游戏管理器或需要访问该对象的对象报告自己,就像这样:
void Start() { GetComponentInParent<GameManager>().OnPlayerSpawned(this); }
我还要提到一些脚本,通过名称查找对象并访问其组件通常是一个坏主意。这是一个始终牢记的设计准则:您应该尽可能少地遍历Unity的对象层次结构,即使这样做,也应仅遍历没有附加其他脚本的对象。在这种情况下,您还应该在Player
脚本中放入控制Animator的逻辑。然后,您无需首先获得对Animator的引用。