Unity:无法访问Childrens SpriteRenderer.enabled

时间:2017-06-27 12:06:03

标签: unity3d unity5 unityscript

我在访问Player GameObject的子节点时遇到启用变量时遇到问题。 enter image description here

-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);
        }
    }
}

1 个答案:

答案 0 :(得分:2)

您的脚本代码没问题,问题应该在其他地方。

首先,禁用Animator组件并运行脚本:如果启用/禁用精灵渲染器工作,那么如果您在任何地方都拥有Sprite Renderer.Enabled属性,则必须查看动画片段可能你会拥有它 - 删除它,这样你就可以只通过脚本启用/禁用渲染器。

如果脚本仍然不起作用,则问题出在其他地方(另一个正在访问渲染器的enabled属性的脚本)。

但我敢打赌,您正在更改动画片段中的enabled属性,由于Unity执行顺序的工作原理,它取代了脚本(动画总是在脚本之后更新)在渲染之前)。