【问题标题】:Unity: Can't access Childrens SpriteRenderer.enabledUnity:无法访问儿童 SpriteRenderer.enabled
【发布时间】:2017-06-27 12:06:02
【问题描述】:

我在访问 Player GameObject 的子项中的启用变量时遇到问题。

-Human拥有Rigidbody2D、BoxCollider、PlayerController脚本和Animator

-body 和 range_attack_body 只持有 SpriteRenderer

我想做什么:

我想在按住鼠标按钮时更改我的播放器对象的 SpriteRenderer。 body 和 range_attack_body 中有 SpriteRenderer。两个游戏对象都是动画的一部分。 body.SpriteRenderer 在正常运动期间处于活动状态,而 range_attack_body.SpriteRenderer 处于非活动状态。 在我的 PlayerController 脚本中,我编写了一个例程,该例程将在按住鼠标按钮时触发攻击动画。在这个例程中,我想更改 SpriteRenderers 的启用状态。但是什么都没有发生,这意味着变量在运行时不会改变。我已经检查了在 Awake() 期间是否正确访问了 GameObjects 和 SpriteRenderer,并且我可以使用调试消息在我的 SpriteRenderer 数组中找到这两个渲染器。 最重要的是,我检查了如果我将 SpriteRenderer 添加到我的 Human GameObject 会发生什么。它将出现在我的 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);
        }
    }
}

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

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

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

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

    但我敢打赌,您正在更改动画剪辑中的 enabled 属性,由于 Unity 执行顺序的工作方式,该属性取代了脚本(动画总是在脚本之后和渲染之前更新)。

    【讨论】:

    • 就是这样!我忘记了在发布动画中我仍然有启用的属性。删除剪辑后,我的脚本运行良好。非常感谢! :D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多