teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

ソースコード追記

2018/04/26 11:51

投稿

sakura_hana
sakura_hana

スコア11429

answer CHANGED
@@ -3,4 +3,62 @@
3
3
  非表示にするだけなら`gameObject.SetActive(false)`または
4
4
  描画系のコンポーネントをオフにする(例えば`GetComponent<Renderer>().enabled = false;`)といいかと思います。
5
5
 
6
- 後は配列やリストを使って「どの順番でオブジェクトが選択されたか」を記憶しておけばよいかと。
6
+ 後は配列やリストを使って「どの順番でオブジェクトが選択されたか」を記憶しておけばよいかと。
7
+
8
+ ---
9
+
10
+ コメントを受けてソースコードを修正しました。
11
+ ちゃんと動作確認してませんのでエラー起こったら適宜修正お願いします。
12
+
13
+ ```C#
14
+ public class Switching : MonoBehaviour
15
+ {
16
+ //各メソッドで使うのでクラス変数にする
17
+ private List<GameObject> hideGameObject;
18
+
19
+ void Start ()
20
+ {
21
+ //初期化は開始直後にやっておく(初期化しておかないとエラーになる)
22
+ hideGameObject = new List<GameObject> ();
23
+ }
24
+
25
+ public void Update()
26
+ {
27
+ if (Input.GetMouseButtonDown(0))
28
+ {
29
+ Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
30
+
31
+ RaycastHit hit = new RaycastHit();
32
+
33
+ if (Physics.Raycast(ray, out hit, distance))
34
+ {
35
+ //Destroy(hit.collider.gameObject);
36
+ //↓差し替え
37
+ hit.collider.gameObject.SetActive(false);
38
+
39
+ //「消された時」に保存する
40
+ hideGameObject.Add (hit.collider.gameObject);
41
+
42
+ //ちなみに「GameObject.Find」は名前で検索なので
43
+ //GameObject.Find ("hit.collider.gameObject")は
44
+ //「hit.collider.gameObjectという名前のオブジェクトを探す」ことになってしまう。
45
+ //そうではない筈なのでここも変える。
46
+ }
47
+ }
48
+ }
49
+
50
+ void ReDisplay()
51
+ {
52
+ if (Input.GetMouseButtonDown (1)) {
53
+ //再表示するのは「一番後ろ」のオブジェクト。
54
+ //[-1]だと「-1番目のオブジェクト」になってしまうのでこれもエラーが出る。
55
+ //考え方は配列と一緒なので「配列の数-1」が最後尾。
56
+ hideGameObject [hideGameObject.Count-1].SetActive (true);
57
+
58
+ //「countの定義が含まれていない」→「Count」が正しい(頭文字が大文字)
59
+ //予測変換を頼ったりListクラスのリファレンスを見ると分かる。
60
+ hideGameObject.Remove (hideGameObject.Count - 1);
61
+ }
62
+ }
63
+ } //ここ ] になっていたのでコピペミスかもしれませんが一応直してあります
64
+ ```