質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

2494閲覧

拡張エディタのシーンビュー操作でCtrl+Zを有効にする

退会済みユーザー

退会済みユーザー

総合スコア0

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2019/07/05 17:36

前提・実現したいこと

エディタ拡張でオブジェクトの配置を試しましたが、Ctrl+Zで元の位置に戻れるようにするにはどうすればよいのでしょうか?
通常、シーンビューで、ドラッグなどでオブジェクトを移動させて配置すると、
Ctrl+Zで移動前の位置に戻すことができます。
しかし、自作したエディタ拡張のオブジェクト配置処理では、実行すると、
シーンビューでCtrl+Zを押しても、戻らないです。

該当のソースコード

C#

1using UnityEngine; 2using UnityEditor; 3 4public class SetObject 5{ 6 7 [MenuItem("MyMenu/SetObject")] 8 private static void setCube() 9 { 10 GameObject cube = GameObject.Find("Cube"); 11 cube.transform.position = new Vector3(0, 0, 0); 12 } 13 14}

試したこと

考えられることとしては、移動前にオブジェクトの位置を記憶させておくとかですが、
この力技しかないのでしょうか?
位置だけでなく、回転も戻したい、スケールも戻したい、とかいろいろ戻したくなったら、全ての情報を保存しなければなりません。
また、通常のシーンビューの操作では、Ctrl+Zで1個前だけでなく、2個前、3個前と遡って戻せます(これも自作で保存してたら手間です)。
本来のCtrl+Zで戻すようにできる方法(Ctrl+Zで位置を戻すというより、Ctrl+Zを有効にして前回の操作に戻す方法)が知りたいです。
ご教示お願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Undoに取り消し関連の機能が用意されており役立つかと思います。今回のようなケースの場合、RecordObjectを使ってtransformに加えた変更を覚えさせてやるのがいいんじゃないでしょうか。

C#

1using UnityEngine; 2using UnityEditor; 3 4public class SetObject 5{ 6 7 [MenuItem("MyMenu/SetObject")] 8 private static void setCube() 9 { 10 GameObject cube = GameObject.Find("Cube"); 11 12 if (cube == null) 13 { 14 // 念のためCubeが見つからなかったら中断 15 return; 16 } 17 18 Transform cubeTransform = cube.transform; 19 20 // cubeTransformへの変更を記録するよう指示してから位置を移動 21 Undo.RecordObject(cubeTransform, "Set Cube"); 22 cubeTransform.position = new Vector3(0, 0, 0); 23 } 24 25}

投稿2019/07/05 23:44

Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/07/06 07:33 編集

ご回答ありがとうございます。 Undo.RecordObjectメソッドというものがあるのですね、勉強になります。 ご教示いただいた方法でできました。 すみません、2点質問があります。 ・質問1。 Transform cubeTransform = cube.transform; Undo.RecordObject(cubeTransform, "Set Cube"); こちら、下記のように1行にまとめても、問題ないでしょうか? 一応、変わりなさそうに見えました。 Undo.RecordObject(cube.transform, "Set Cube"); ・質問2。 エディタ拡張について調べていたら疑問が出てきてしまったのですが、 サイトによっては、エディタ拡張のスクリプトファイルはEditorフォルダに作るべきと説明されてましたが、Editorフォルダでなく、Assets直下にファイルを置いても動作しているようでした。 Editorフォルダの中にEditor拡張スクリプトファイルを作る必要はありますか? あと、ご提示のRecordObjectのリンクのリファレンスのサンプルコードでは、 Editor拡張クラスをEditorクラスを継承して実装しているようでしたが、 Editor拡張で、Editorクラスを継承する必要やメリットはありますか? (Editor拡張で意図した操作ができていればEditorクラスは継承する必要はないですか?) また、EditorWindowクラスを継承しているコードも見かけました。
Bongo

2019/07/06 07:57 編集

質問1について はい、その書き方でも大丈夫です。回答内で言及しましたUndoクラスの方のリファレンスページに重要操作として例示されているコードでは、そのスタイルでtransformを操作していました。 私の例示したコードで一旦transformを別の変数に代入していたのは、実のところなんとなく...でして大した理由はありません。あえて挙げるとしたら、実際の処理ではこのtransformに対して移動だけでなく引き続き様々な操作をするかもしれないと考え、「transformの取得に最適化がされていた件 - 渋谷ほととぎす通信」( https://www.shibuya24.info/entry/transform_access )で検証されているような理由からtransformプロパティへ毎回アクセスするよりも多少は効率的かな...と思ってのことでした。 効率化の程度はごくわずかですし、毎フレーム行う処理でもないでしょうから、ご質問者さんにとってしっくりくるスタイルで書いていただいて問題ないと思います。 質問2について スクリプトをEditorフォルダーに置くべきかどうかについては、一応「特殊なフォルダー名 - Unity マニュアル」( https://docs.unity3d.com/ja/current/Manual/SpecialFolders.html )にはEditorフォルダーに置けと言っているようですし、特に理由(ゲーム実行時用のコードとエディター用コードを一つのソースファイルに共存させたいとか?)がなければ従っておくのがいいんじゃないでしょうかね。 すみませんがEditorフォルダーに置かないことによる重大な問題があるのかはよく分かりませんが、逆にEditorフォルダーに置くことによる利点として、ゲーム用のスクリプトとエディター用のスクリプトのアセンブリが分かれるという点が挙げられそうです。スクリプトを編集しても、再コンパイルが必要なアセンブリだけがコンパイル対象になるので、コンパイル時間を短縮できるんじゃないでしょうか。 Editorクラス、EditorWindowクラスについては、今回のケースでは継承の必要はないでしょう。このEditorクラスのEditorというのはコンポーネントのエディター...つまりオブジェクトを選択してインスペクターを表示したときに出てくる、各コンポーネントの状態を編集するための区画とかを指すようです。 スクリプトを作成してそれをオブジェクトにアタッチすると通常はインスペクターにはシリアライズされたフィールドが並ぶだけですが、そうではなくてもっとパラメーターを編集しやすいよう独自の表示にカスタマイズしたいときには使うことになるかと思います。 RecordObjectのサンプルコードでは、EffectRadiusというスクリプト用のエディターを作成しているようですね。多分、EffectRadiusをアタッチしたオブジェクトを選択するとシーンビュー上にエフェクトの効果範囲を表す球体が現れ、掴んで操作することで視覚的に半径を調節できるようになるんじゃないでしょうか。 また、EditorWindowはUnityの画面各所を構成している、上辺に小さなタブの付いたミニウィンドウを独自に作成したい場合に使うことになるでしょう。
退会済みユーザー

退会済みユーザー

2019/07/06 16:49

ご回答ありがとうございます。 理解できました。 EditorクラスやEditorWindowクラスのご教示もありがとうございます。 とても勉強になりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問