(10/19加筆、訂正しました。)
Unity 3Dで、
ゲームモードでクリックしたところにオブジェクトを生成していきます。
このオブジェクト(プレハブ)の作成スクリプトは以下です。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SkewCreater : MonoBehaviour { public GameObject prefabobj; public Renderer rend; // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { if (Input.GetMouseButtonDown(0)) { Vector2 touchScreenPosition = Input.mousePosition; touchScreenPosition.x = Mathf.Clamp(touchScreenPosition.x, 0.0f, Screen.width); touchScreenPosition.y = Mathf.Clamp(touchScreenPosition.y, 0.0f, Screen.height); Camera gameCamera = Camera.main; Ray touchPointToRay = gameCamera.ScreenPointToRay(touchScreenPosition); RaycastHit hitInfo = new RaycastHit(); if (Physics.Raycast(touchPointToRay, out hitInfo)) { Instantiate(prefabobj, hitInfo.point, Quaternion.identity); } } } }
このプレハブ生成のやり直し機能、すなわち undo / redo 機能の実装に苦慮しています。
以下のyoutube 、ウェブサイトを参考に、
https://www.youtube.com/watch?v=gnyDH1kcZKQ
https://mega.nz/file/aERhlSRY#f7iLx88J9ytc9l48P15v6peAmWghdQxjL1aQo-0QfEM
3つのスクリプトを書きました。
・CommandManager
using System.Collections; using System.Collections.Generic; using System.Runtime.InteropServices.WindowsRuntime; using UnityEngine; public class CommandManager : MonoBehaviour { private Stack<IAction> historyStack = new Stack<IAction>(); private Stack<IAction> redoHistoryStack = new Stack<IAction>(); public void ExecuteCommand(IAction action) { action.ExecuteCommand(); historyStack.Push(action); redoHistoryStack.Clear(); } public void UndoCommand() { if(historyStack.Count > 0) { redoHistoryStack.Push(historyStack.Peek()); historyStack.Pop().UndoCommand(); } } public void RedoCommand() { if(redoHistoryStack.Count > 0) { historyStack.Push(redoHistoryStack.Peek()); redoHistoryStack.Pop().ExecuteCommand(); } } }
・IAction
using System.Collections; using System.Collections.Generic; using UnityEngine; public interface IAction { void ExecuteCommand(); void UndoCommand(); }
・InstantiateCommand
using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using UnityEngine; public class InstantiateCommand : IAction { private GameObject toSpawnGameObject; private Vector3 positionToSpawn; private GameObject spawnedGameObject; public InstantiateCommand(GameObject toSpawnGameObject,Vector3 positionToSpawn) { this.toSpawnGameObject = toSpawnGameObject; this.positionToSpawn = positionToSpawn; } public void ExecuteCommand() { spawnedGameObject = GameObject.Instantiate(toSpawnGameObject, positionToSpawn, Quaternion.identity); } public void UndoCommand() { GameObject.Destroy(spawnedGameObject); } }
次いでHierarchy windowに空のゲームオブジェクト<Player>を置き、これにCommandManagerをアタッチし、
UI Buttonを2つ作成、それぞれにOn Click()でシーン上のこの<Player>を指定、UndoCommandとRedoCommandをそれぞれアタッチしました。
しかしUndoボタンをクリックしてもinstantiateしたプレハブが消えません。
どこがおかしいでしょうか。
ご教示頂けますと幸甚です。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。