uGUIのイベントコールバック登録をコードから行う方法とUnityActionデリゲート群
今までUnityActionの使い方がわかりませんでしたがいい記事を見つけたのである程度わかるようになりました。
今まではdelegateとeventで命令していましたがゲームを終えた時、ひよこより先にCharCreateManagerが消えるのでメソッドの解除時nullになっていました。
UnityEngine.Events.UnityEventはRemoveAllListenersで安全にメソッドの解除ができたのでよかったです。
リストを作ってシーンの全てのひよこ情報を追加する
discに保存するコードは省いてます。
シーンの全てのひよこに命令
CreateCharManagerはゲームシーンに一つ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public class CreateCharManager : MonoBehaviour{ [System.NonSerialized] public List <Vector3> charPosList = new List<Vector3>(); [System.NonSerialized] public List <Vector3> charRotList = new List<Vector3>(); [System.NonSerialized] public List <int> charKindList = new List<int>(); [System.NonSerialized] public List <bool> isActiveBottomColliderOfCharList = new List<bool>(); public UnityEngine.Events.UnityEvent saveCharacterData; public void SaveCharDataToDisc(){ saveCharacterData.Invoke(); //delegate to all chicks in scene. } void OnDestroy () { saveCharacterData.RemoveAllListeners(); } } |
各ひよこは位置、回転、種類、コライダーのOnOFFをcreateCharManagerのリストに追加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
public class ChickManager : CharacterManager{ void saveData() { createCharManager.charPosList.Add(thisTransform.localPosition); createCharManager.charRotList.Add(thisTransform.localRotation.eulerAngles); createCharManager.charKindList.Add(thisCharScore); if(boxCollider.enabled) createCharManager.isActiveBottomColliderOfCharList.Add (true); else createCharManager.isActiveBottomColliderOfCharList.Add (false); } void OnEnable(){ createCharManager.saveCharacterData.AddListener(saveData); } void OnDisable(){ UnSubscribeEvent(); } void OnDestroy(){ UnSubscribeEvent(); } void UnSubscribeEvent(){ createCharManager.saveCharacterData.RemoveListener(saveData); } } |
projectはここにあります。
GitHub project