質問: FirstPosi; } }
回答: 実装方法は複数パターンあるかもしれませんが、以下の様な方法はいかがでしょうか。 **処理概要** 1、子オブジェクトのpositionを格納するためのListを宣言 2、Start()関数内で、子オブジェクトの初期位置をListに格納 3、AllPosiReset()関数実行時に、Listで保持しているpositionを子オブジェクトに再設定 **気になる点** foreachで子オブジェクトを取得する際、Start()関数とAllPosiReset()関数で必ず同じ順番で取得できるかは私も分かっておりません。。 もし順番が異なることがある場合、別の子オブジェクトのpositionが適用されてしまうことがあるかもです。 なので、もしそうなった場合はコメント頂ければと思います。 ``` using System.Collections; using System.Collections.Generic; using UnityEngine; public class ResetSample : MonoBehaviour { public Transform ParentModel; // 親オブジェクト格納用 private List originalPosList; // 元のPosition格納用 void Start() { // リスト生成 originalPosList = new List(); // 子オブジェクトの初期位置をリストに格納 foreach (Transform child in ParentModel) { originalPosList.Add(child.transform.localPosition); } } public void AllPosiReset() { // 子オブジェクトの位置をリセット int i = 0; foreach (Transform child in ParentModel) { child.transform.localPosition = originalPosList[i]; i++; } } } ``` ### 2020.09.14追記 階層構造になっているGameObjectのリセット方法はいくつかありますが、今回は こちら を利用した方法を共有させて頂きます。 **大まかな手順** 1、全てのGameObjcectを表示状態にする 2、対象のGameObjectに対し、独自のタグを設定する(インスペクターからあらかじめ独自のタグを追加しておく必要あり) 3、アプリ開始直後のTransformを保持する 4、右クリックメニュー内などのイベント内で(任意のイベントで)、Transformを元に戻す **以下サンプル** ``` using System.Collections; using System.Collections.Generic; using UnityEngine; public class StateChangeSample : MonoBehaviour { // ルートとなるGameObject格納用 public GameObject rootObj; // GameObjectのTransform類格納用(リセット処理にて利用する) private Vector3[] defaultPos; private Vector3[] defaultScale; private Quaternion[] defaultRot; private Transform[] models; void Start() { // 全オブジェクトを表示する SetActiveRecursively(rootObj, true); // GameObject検索用に、GameObjectに独自のタグを設定する // ※インスペクターから、タグを追加しておく必要あり SetOriginalTag(rootObj, "Parts"); // 開始時のTransformを保持する BackUpTransform(); } // リセットボタン押下時処理 // ※こちらではボタン押下時のイベントとして設定 // 質問者さんの方では、右クリックメニューのイベントなどで「ResetTransform」メソッドを呼んでください public void ResetBtnClick() { // Transformをリセットする ResetTransform(); } // オブジェクトの表示・非表示切り替え処理 // ※再帰処理にて、全オブジェクトを対象とする public void SetActiveRecursively(GameObject obj, bool state) { obj.SetActive(state); foreach (Transform child in obj.transform) { SetActiveRecursively(child.gameObject, state); } } // タグの追加処理 void SetOriginalTag(GameObject obj, string tagStr) { obj.tag = tagStr; foreach (Transform child in obj.transform) { SetOriginalTag(child.gameObject, tagStr); } } // バックアップ処理 // ※開始直後のTransformを保持する void BackUpTransform() { //Find GameObjects with Model tag GameObject[] tempModels = GameObject.FindGameObjectsWithTag("Parts"); //Create pos, scale and rot, Transform array size based on sixe of Objects found defaultPos = new Vector3[tempModels.Length]; defaultScale = new Vector3[tempModels.Length]; defaultRot = new Quaternion[tempModels.Length]; models = new Transform[tempModels.Length]; //Get original the pos, scale and rot of each Object on the transform for (int i = 0; i < tempModels.Length; i++) { models[i] = tempModels[i].GetComponent(); defaultPos[i] = models[i].position; defaultScale[i] = models[i].localScale; defaultRot[i] = models[i].rotation; } } // リセット処理 // ※Transformを、開始直後の状態にリセットする void ResetTransform() { //Restore the all the original pos, scale and rot of each GameOBject for (int i = 0; i < models.Length; i++) { models[i].position = defaultPos[i]; models[i].localScale = defaultScale[i]; models[i].rotation = defaultRot[i]; } } } ```