我在访问Player GameObject的子节点时遇到启用变量时遇到问题。
-Human持有Rigidbody2D,BoxCollider,PlayerController脚本和Animator
-body和range_attack_body只持有SpriteRenderer
我想做什么:
当鼠标按钮处于保持状态时,我想更改播放器对象的SpriteRenderer。 body和range_attack_body中有SpriteRenderers。两个GameObject都是动画的一部分。 body.SpriteRenderer处于活动状态,range_attack_body.SpriteRenderer在正常运动期间处于非活动状态。 在我的PlayerController脚本中,我编写了一个例程,当鼠标按钮处于保持状态时将触发攻击动画。在这个例程中,我想更改SpriteRenderers的启用状态。但是没有发生任何事情,这意味着varibales在运行时不会改变。我已经检查过在Awake()期间是否正确访问了GameObjects和SpriteRenderers,我可以使用调试消息在我的SpriteRenderer数组中找到两个渲染器。 最重要的是,我检查了如果我向我的Human GameObject添加一个SpriteRenderer会发生什么。它将出现在我的SpriteRenderer数组中,并且我可以完全访问已启用的变量,这意味着我可以在我的例程中更改它们。因此我认为可能存在与body和range_attack_body的冲突,因为他们的SpriteRenderers是动画的一部分。我将Human.SpriteRenderer添加到动画中,仍然可以更改变量。 我不知道发生了什么,请帮忙。这是一些代码:
public class PlayerController2D : PhysicsObject {
public float maxSpeed = 7f;
public float jumpTakeOffSpeed = 7f;
public float posOffset = 1;
protected bool flipSprite = false;
protected bool flipState = true;
private Animator animator;
private SpriteRenderer[] spriteRenderers;
void Awake ()
{
animator = GetComponent<Animator> ();
GameObject human = GameObject.Find("Human");
spriteRenderers = human.GetComponentsInChildren<SpriteRenderer> ();
}
protected override void Attack ()
{
if(Input.GetMouseButton(0))
{
spriteRenderers[0].enabled = false;
spriteRenderers[1].enabled = true;
Debug.LogError("Inhalt:" + spriteRenderers[0].ToString());
Debug.LogError("Inhalt:" + spriteRenderers[1].ToString());
animator.SetBool("attack", true); // boolean to start hold animation
}
else if(!Input.GetMouseButton(0))
{
spriteRenderers[0].enabled = true;
spriteRenderers[1].enabled = false;
animator.SetBool("attack", false);
}
}
}
答案 0 :(得分:2)
您的脚本代码没问题,问题应该在其他地方。
首先,禁用Animator
组件并运行脚本:如果启用/禁用精灵渲染器工作,那么如果您在任何地方都拥有Sprite Renderer.Enabled
属性,则必须查看动画片段可能你会拥有它 - 删除它,这样你就可以只通过脚本启用/禁用渲染器。
如果脚本仍然不起作用,则问题出在其他地方(另一个正在访问渲染器的enabled
属性的脚本)。
但我敢打赌,您正在更改动画片段中的enabled
属性,由于Unity执行顺序的工作原理,它取代了脚本(动画总是在脚本之后更新)在渲染之前)。