2017-06-27 12 views
0

私のPlayer GameObjectの子供の使用可能な変数にアクセスする際に問題があります。 enter image description hereUnity:ChildrensにアクセスできないSpriteRenderer.enabled

- ヒトが唯一の私が何をしたいのかSpriteRenderer

を保持Rigidbody2D、BoxCollider、PlayerControllerスクリプトやアニメーター

が-bodyとrange_attack_body保持している:私は私のSpriteRendererを変更したい

マウスボタンが押されているときのPlayerオブジェクトです。 bodyとrange_attack_bodyにはSpriteRenderersがあります。どちらのゲームオブジェクトもアニメーションの一部です。 body.SpriteRendererがアクティブで、通常の動作中はrange_attack_body.SpriteRendererが非アクティブです。 私のPlayerControllerスクリプトでは、マウスボタンが押されているときに攻撃アニメーションをトリガーするルーチンを書きました。このルーチンでは、SpriteRenderersの有効状態を変更したいと考えました。しかし、何も起こっていない、つまり、varibalesが実行時に変更されていないことを意味します。 GameObjectsとSpriteRenderersがAwake()の間に正しくアクセスされているかどうかをチェックしていて、SpriteRenderer配列の両方のレンダラーをデバッグメッセージを使って見つけることができます。 これに加えて、ヒューマンゲームオブジェクトにSpriteRendererを追加するとどうなるかを確認しました。私のSpriteRenderer配列に表示され、私は自分のルーチンでそれらを変更することができます有効な変数への完全なアクセス権を持っています。だから私は、SpriteRenderersがアニメーションの一部であるため、bodyとrange_attack_bodyとの競合があるかもしれないと考えました。私は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); 
     } 
    } 
} 

答えて

2

スクリプトコードは問題ありません。問題は他の場所にあるはずです。

まず、Animatorコンポーネントを無効にして、スクリプトを実行:あなたはどこにでもSprite Renderer.Enabled性質を持っている場合は、アニメーションクリップで見なければならないよりも、おそらくあなたはそれを持っているだろう、スプライトレンダラの作業を無効/有効にする場合 - それを削除して、レンダラーをスクリプトでのみ有効/無効にすることができます。

スクリプトがまだ動作しない場合、問題は他の場所(レンダラーのenabledプロパティにアクセスしている別のスクリプト)です。

しかし、enabledプロパティをアニメーションクリップから変更すると、Unity実行順序がどのように動作するか(アニメーションは常にスクリプトの後で、レンダリング前に更新されるため)、スクリプトを置き換えることになります。

+0

それでした!私はリリースアニメーションの中で有効になっているプロパティをまだ持っていたことを忘れていました。クリップを削除した後、スクリプトはうまくいきました。どうもありがとう! :D – SuperTasche

+0

あなたは喜んで喜んで助けになるでしょう。 :) – Galandil

関連する問題