やりたいこと
Unityで2Dゲームを作成しようと思っています。Unity歴1ヶ月ほど、ゲーム開発経験なしです。
下記サイトを参考に、1つのAnimatorControllerを画像の差し替えのみで(同画面内の)複数キャラに使いまわそうと思っています。
→参考にさせていただいたサイト
質問したいこと
一応思った通りの動作はしてくれたのですが腑に落ちない部分があります。
「sprRenderer.SetPropertyBlock(block);」について、
「Update()」で実行すると、差し替え前のアニメがちらちら見えます。
「LateUpdate()」で実行すると、それがなくなり問題なく表示されます。
「Update()」では上手く表示されなかった原因はなんでしょうか?
ネットで調べてみてもコレというものが見つかりませんでした。
海外のサイトで「アニメーションシステムは、更新後、LateUpdateの前に更新されることに注意(和訳済み)」と書いてあるのを見つけたのですが、このことなのでしょうか?(よく理解は出来ていないのですが)
また、この方法が効率が良いと思ったので採用を考えているのですが、もしこの方法での問題点やほかに良い方法などがあればアドバイスを頂けると幸いです。
該当のソースコード
私が動作確認に使用したスクリプトはこちらになります。
下記のことを行っています。
- SpriteRendereからMaterialPropertyBlockを取得する。
- 取得した内容を任意のTextureで上書きする。
- SpriteRendereを上書き後の内容で更新する。(Update / LateUpdate)
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Enemy : MonoBehaviour 6{ 7 // アニメーション差し替え用テスクチャ 8 [SerializeField] 9 private Texture texture = null; 10 11 // プロパティーのIDを取得しておく 12 // マテリアルのシェーダーのテクスチャ変数名らしい 13 private static int idMainTex = Shader.PropertyToID("_MainTex"); 14 15 // アニメーターコンポーネントへの参照を格納する 16 private Animator animator; 17 18 // スプライトレンダラーコンポーネントへの参照を格納する 19 private SpriteRenderer sprRenderer; 20 21 // オブジェクトのマテリアル情報を格納する 22 private MaterialPropertyBlock block; 23 24 25 void Awake() 26 { 27 // 各コンポーネントを取得など 28 block = new MaterialPropertyBlock(); 29 sprRenderer = GetComponent<SpriteRenderer>(); 30 animator = GetComponent<Animator>(); 31 32 // SpriteRenderer から MaterialPropertyBlock を取得 33 sprRenderer.GetPropertyBlock(block); 34 35 // MaterialPropertyBlock にテスクチャをセットして上書き 36 block.SetTexture(idMainTex, texture); 37 38 // 初期のキャラの向きを設定 39 animator.SetInteger("direction", 1); 40 } 41 42 void Update() 43 { 44 // MaterialPropertyBlock を SpriteRenderer にセット 45 //sprRenderer.SetPropertyBlock(block); // こっちだとチラチラと元のアニメが見える 46 } 47 48 void LateUpdate() 49 { 50 // MaterialPropertyBlock を SpriteRenderer にセット 51 sprRenderer.SetPropertyBlock(block); 52 } 53}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/16 18:11 編集