質問編集履歴

5

回答を頂き解決したので、解決したスクリプトを載せました。

2020/02/26 00:02

投稿

Kageyama_23457
Kageyama_23457

スコア21

test CHANGED
File without changes
test CHANGED
@@ -1,12 +1,16 @@
1
- ### 前提・実現したいこと
1
+ ### 書き換えました
2
+
2
-
3
+ 2月26
4
+
3
-
5
+ 回答を頂き、「ゲーム実行前にはヒエラルキに存在していないプレハブを取得する記述」に書き換えました。
6
+
4
-
7
+ しかし結局「スクリプトAのboolでスクリプトBのboolをtrue,falseにする」については、
8
+
5
- 2月25日 回答を頂き問題点が変わったので、タイトル内容を書換えました。
9
+ とりあえずところstatic解決するいうところに行着きました。
6
-
10
+
7
- プレハブ生成オブェクトのスクリプト追加しまし
11
+ 超初歩的なことで質問ページを立ててしまい大変お恥ずかいのですが、このまま残しておきます
12
+
8
-
13
+ ###前提
9
-
10
14
 
11
15
  Unity、C#ともに初心者なので至らぬ点あるかと思いますがご容赦ください。
12
16
 
@@ -34,17 +38,13 @@
34
38
 
35
39
  仮にこの能力のキャラをAとします。
36
40
 
37
- できるのなら以下のように、
41
+
38
-
39
- 他のキャラのスクリプトから、必殺技アイテムのスクリプトのboolを参照し、自身のboolと結びつけたいのですが…
42
+
40
-
41
-
42
-
43
- 必殺技アイテムのスクリプト(プレハブで量産。大元のオブジェクトのスクリプトではなく、プレハブのスクリプトを別スクリプトから参照したい)
43
+ 必殺技アイテムのスクリプト(プレハブで量産。大元のオブジェクトのスクリプトではなく、プレハブのスクリプトを別スクリプトから参照したい→staticでとりあえず解決
44
44
 
45
45
  ```C#
46
46
 
47
- public bool isA=false;//キャラAと接触した際のbool
47
+ public static bool isA=false;//キャラAと接触した際のbool、staticにしておく
48
48
 
49
49
 
50
50
 
@@ -78,6 +78,8 @@
78
78
 
79
79
 
80
80
 
81
+ isA = false;
82
+
81
83
  anim_CI_Ctrl.SetBool("CI_A", false);
82
84
 
83
85
  }
@@ -88,11 +90,23 @@
88
90
 
89
91
  他キャラ(小さくされるキャラたち)のスクリプト
90
92
 
93
+
94
+
91
95
  ```C#
92
96
 
93
- public GameObject SA;//必殺技アイテム インスペクで取得
97
+ private GameObject _ObjectG,_saprefab=null;//ジェネレーとプレハブ変数宣言
94
-
98
+
99
+
100
+
95
- private bool _isA;
101
+ void Start()
102
+
103
+ {
104
+
105
+ _ObjectG = GameObject.Find("ObjectGenerator");
106
+
107
+ _saprefab = _ObjectG.GetComponent<SA>().gameObject;//ここで生成される前にプレハブを取得していますが↓
108
+
109
+ }
96
110
 
97
111
 
98
112
 
@@ -100,23 +114,21 @@
100
114
 
101
115
  {
102
116
 
117
+
118
+
103
- SAprefab Sas=SA.GetComponent<SAprefab>();
119
+ if(SAprefab.isA==true)//staticで解決するので上記プレハブの取得は結果不要でした
104
-
105
- _isA=Sas.isA;
120
+
106
-
107
- if(_isA==true)
108
-
109
- {//Debug.Log("小さくされた!");
121
+ {Debug.Log("小さくされた!");
110
-
122
+
111
- //小さく挙動を記述}
123
+ StartCoroutine(A());//小さくされコルーチン開始 コルーチンの方はまた別の不具合が出ているので今回は載せません
124
+
125
+ }
112
126
 
113
127
  }
114
128
 
115
-
116
-
117
129
  ```
118
130
 
119
- プレハブを生成する空のゲームオブジェクトのスクリプト(他のスクリプトで障害物なども生成しています)
131
+ プレハブを生成する空のゲームオブジェクトのスクリプト
120
132
 
121
133
  ```#C
122
134
 
@@ -138,6 +150,8 @@
138
150
 
139
151
  private float time = 0f;//経過時間
140
152
 
153
+ public List<GameObject> StandAList = new List<GameObject>();//リスト化 これを小さくされるキャラのスクリプトから参照し、生成される前にプレハブを取得
154
+
141
155
 
142
156
 
143
157
  void Start()
@@ -162,7 +176,9 @@
162
176
 
163
177
  {
164
178
 
165
- GameObject StandA = Instantiate(SAPrefab);//必殺技アイテムのプレハブを生成する
179
+ GameObject SA = Instantiate(SAPrefab);//必殺技アイテムのプレハブを生成する
180
+
181
+ StandAList.Add(StandA);//生成されたプレハブをリストに追加
166
182
 
167
183
  float x = Random.Range(-8f, 8f);
168
184
 
@@ -182,48 +198,6 @@
182
198
 
183
199
  ```
184
200
 
185
- 投稿当初の状態から、回答を頂き現在上記の状態です。
186
-
187
- 現在、
188
-
189
- 小さくされるキャラのインスペクタで必殺技アイテムのプレハブを取得させ、
190
-
191
- (GameObject.FindでやるとnullReferenceエラーが出ました)、
192
-
193
- 必殺技アイテムのプレハブのスクリプトのbool isAを、
194
-
195
- インスペクタで強制的にtrueにすると、
196
-
197
- 小さくされるキャラ側のスクリプトのDebug.Logが表示され、連結が確認できる状態です。
198
-
199
- ですが、ゲームを実行上でキャラAが必殺技アイテム(プレハブ)と接触しても、
200
-
201
- Debug.Logは表示されません。
202
-
203
-
204
-
205
- 「ゲームを実行しないと存在しないプレハブを取得させる記述」というものがあるのでしょうか?
206
-
207
- 「プレハブ スクリプト 取得」などで検索してみましたがプレハブ生成方法ばかり出てきます。
208
-
209
- もし解決法をご存知の方がいらっしゃいましたら、ご教授頂きたく存じます。
210
-
211
- ### 今まで自分ができた、関係の強そうなこと
212
-
213
- ①親子オブジェクト 子スクリプトに親の挙動を含んだboolを書き、それを親スクリプトが参照し、親が従って挙動する [こちらのページ(自己解決済みの質問ページ)](https://teratail.com/questions/240565)
214
-
215
- ②上記スクリプト内にありますが、必殺技アイテムスクリプトからUIイメージのアニメータのSetBoolをtrue,falseにする
216
-
217
-
218
-
219
- 今回のようなケースの場合、
220
-
221
- 「必殺技アイテムスクリプトの方に13人分のboolと必殺技の挙動を書いておく」こともできなくはないですが、
222
-
223
- できれば自機以外の12人が共有するCPUスクリプトの方に自身の挙動を書きたいです。
224
-
225
- 皆様のお知恵をお借り致したく存じます。
226
-
227
201
  ### 補足情報(FW/ツールのバージョンなど)
228
202
 
229
203
  ■作業環境

4

追加したスクリプト名を書くのを忘れたので書きました。

2020/02/26 00:02

投稿

Kageyama_23457
Kageyama_23457

スコア21

test CHANGED
File without changes
test CHANGED
@@ -116,6 +116,8 @@
116
116
 
117
117
  ```
118
118
 
119
+ プレハブを生成する空のゲームオブジェクトのスクリプト(他のスクリプトで障害物なども生成しています)
120
+
119
121
  ```#C
120
122
 
121
123
  using System.Collections;

3

2人目の方から回答を頂き、必要だったのでスクリプトを追加しました。

2020/02/25 03:12

投稿

Kageyama_23457
Kageyama_23457

スコア21

test CHANGED
File without changes
test CHANGED
@@ -4,6 +4,8 @@
4
4
 
5
5
  2月25日 回答を頂き問題点が変わったので、タイトルと内容を書き換えました。
6
6
 
7
+ プレハブ生成オブジェクトのスクリプトを追加しました。
8
+
7
9
 
8
10
 
9
11
  Unity、C#ともに初心者なので至らぬ点あるかと思いますがご容赦ください。
@@ -114,6 +116,70 @@
114
116
 
115
117
  ```
116
118
 
119
+ ```#C
120
+
121
+ using System.Collections;
122
+
123
+ using System.Collections.Generic;
124
+
125
+ using UnityEngine;
126
+
127
+
128
+
129
+ public class SA : MonoBehaviour
130
+
131
+ {
132
+
133
+ public GameObject SAPrefab;//なんのプレハブを量産するのか
134
+
135
+ private float interval;//何秒ごとに生成するのか
136
+
137
+ private float time = 0f;//経過時間
138
+
139
+
140
+
141
+ void Start()
142
+
143
+ {
144
+
145
+ interval = 1f;//何秒ごとに生成するのか
146
+
147
+ }
148
+
149
+
150
+
151
+ void Update()
152
+
153
+ {
154
+
155
+ time += Time.deltaTime;
156
+
157
+
158
+
159
+ if (time > interval)//経過時間が生成時間になったら(1秒たったら)
160
+
161
+ {
162
+
163
+ GameObject StandA = Instantiate(SAPrefab);//必殺技アイテムのプレハブを生成する
164
+
165
+ float x = Random.Range(-8f, 8f);
166
+
167
+ float y = Random.Range(-4f, -200f);
168
+
169
+ StandA.transform.position = new Vector2(x, y);
170
+
171
+ time = 0f;//経過時間初期化
172
+
173
+ }
174
+
175
+ }
176
+
177
+ }
178
+
179
+
180
+
181
+ ```
182
+
117
183
  投稿当初の状態から、回答を頂き現在上記の状態です。
118
184
 
119
185
  現在、

2

回答を頂き、問題点が変わったので、タイトルと内容を書き換えました。

2020/02/25 03:10

投稿

Kageyama_23457
Kageyama_23457

スコア21

test CHANGED
@@ -1 +1 @@
1
- スクリトAからスクリプトBのpublicboolを参照し、Bのboolのtrue,falseでAのboolをtrue,falseにしたい
1
+ 生成されたレハブのスクリプトのpublicboolを参照し、のboolのtrue,falseで別スクリプトのboolをtrue,falseにしたい
test CHANGED
@@ -1,4 +1,8 @@
1
1
  ### 前提・実現したいこと
2
+
3
+
4
+
5
+ 2月25日 回答を頂き問題点が変わったので、タイトルと内容を書き換えました。
2
6
 
3
7
 
4
8
 
@@ -26,7 +30,7 @@
26
30
 
27
31
  今回はその中の一人、他のキャラを小さくする能力について質問します。
28
32
 
29
- 仮にこの能力の持ち主のキャラをAとします。
33
+ 仮にこの能力のキャラをAとします。
30
34
 
31
35
  できるのなら以下のように、
32
36
 
@@ -34,7 +38,7 @@
34
38
 
35
39
 
36
40
 
37
- 必殺技アイテムのスクリプト
41
+ 必殺技アイテムのスクリプト(プレハブで量産。大元のオブジェクトのスクリプトではなく、プレハブのスクリプトを別スクリプトから参照したい)
38
42
 
39
43
  ```C#
40
44
 
@@ -110,27 +114,39 @@
110
114
 
111
115
  ```
112
116
 
113
- 回答を頂き上のように書き換えましたが、
117
+ 投稿当初の状態から、回答を頂き現在状態です。
114
118
 
115
- エラーは出ませんがDebug.Logが表示されません。
119
+ 現在
116
120
 
121
+ 小さくされるキャラのインスペクタで必殺技アイテムのプレハブを取得させ、
122
+
123
+ (GameObject.FindでやるとnullReferenceエラーが出ました)、
124
+
125
+ 必殺技アイテムのプレハブのスクリプトのbool isAを、
126
+
127
+ インスペクタで強制的にtrueにすると、
128
+
129
+ 小さくされるキャラ側のスクリプトのDebug.Logが表示され、連結が確認できる状態です。
130
+
131
+ ですが、ゲームを実行上でキャラAが必殺技アイテム(プレハブ)と接触しても、
132
+
133
+ Debug.Logは表示されません。
134
+
135
+
136
+
137
+ 「ゲームを実行しないと存在しないプレハブを取得させる記述」というものがあるのでしょうか?
138
+
139
+ 「プレハブ スクリプト 取得」などで検索してみましたがプレハブ生成方法ばかり出てきます。
140
+
141
+ もし解決法をご存知の方がいらっしゃいましたら、ご教授頂きたく存じます。
142
+
117
- ### 今まで自分ができたこと
143
+ ### 今まで自分ができた、関係の強そうなこと
118
144
 
119
145
  ①親子オブジェクト 子スクリプトに親の挙動を含んだboolを書き、それを親スクリプトが参照し、親が従って挙動する [こちらのページ(自己解決済みの質問ページ)](https://teratail.com/questions/240565)
120
146
 
121
147
  ②上記スクリプト内にありますが、必殺技アイテムスクリプトからUIイメージのアニメータのSetBoolをtrue,falseにする
122
148
 
123
149
 
124
-
125
- ここまではできているのですが、あくまでできることは
126
-
127
- 「スクリプトAからスクリプトBのboolを参照する」までで、
128
-
129
- 「スクリプトAからスクリプトBのboolを参照し、
130
-
131
- スクリプトBのboolのtrue,falseによってスクリプトAのboolのtrue,falseを決定、
132
-
133
- 挙動もスクリプトAの方に記述しておき、挙動させる」ことはできないのでしょうか。
134
150
 
135
151
  今回のようなケースの場合、
136
152
 
@@ -139,8 +155,6 @@
139
155
  できれば自機以外の12人が共有するCPUスクリプトの方に自身の挙動を書きたいです。
140
156
 
141
157
  皆様のお知恵をお借り致したく存じます。
142
-
143
-
144
158
 
145
159
  ### 補足情報(FW/ツールのバージョンなど)
146
160
 

1

頂いた回答を試しても解決しなかったので、とりあえず回答を受け書き換えた箇所を反映しました。

2020/02/25 01:50

投稿

Kageyama_23457
Kageyama_23457

スコア21

test CHANGED
File without changes
test CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
  キャラA:自機スクリプト、Rigidbody2D、コライダ2D持ち。
16
16
 
17
- キャラB~N:いわゆるCPU。CPUスクリプト、Rigidbody2D、コライダ持ち。
17
+ キャラB~N:いわゆるCPU。CPUスクリプト、Rigidbody2D、コライダ2D持ち。
18
18
 
19
19
  自機スクリプトをつけかえれば13人の中から好きに自機キャラを選べる状態です。
20
20
 
@@ -84,19 +84,9 @@
84
84
 
85
85
  ```C#
86
86
 
87
- private GameObject SA;//必殺技アイテム
87
+ public GameObject SA;//必殺技アイテム インスペクタで取得
88
88
 
89
89
  private bool _isA;
90
-
91
-
92
-
93
- void Start()
94
-
95
- {
96
-
97
- SA=GameObject.Find("SA");
98
-
99
- }
100
90
 
101
91
 
102
92
 
@@ -106,11 +96,13 @@
106
96
 
107
97
  SAprefab Sas=SA.GetComponent<SAprefab>();
108
98
 
109
- _isA=Sas.isA();
99
+ _isA=Sas.isA;
110
100
 
111
101
  if(_isA==true)
112
102
 
103
+ {//Debug.Log("小さくされた!");
104
+
113
- {小さくなる挙動を記述}
105
+ //小さくなる挙動を記述}
114
106
 
115
107
  }
116
108
 
@@ -118,31 +110,9 @@
118
110
 
119
111
  ```
120
112
 
121
- のようにすると以下のエラー出ます。
113
+ 回答を頂き以上のように書き換えました
122
114
 
123
- ```
124
-
125
- error CS1955: Non-invocable member 'SAprefab.isA' cannot be used like a method.
126
-
127
- ```
128
-
129
- 和訳をざっくり「必殺技アイテムスクリプト内のisA(bool)は関数として使えないよ」と解釈しているのですが合っていますでしょうか。
130
-
131
-
132
-
133
- そこで、必殺技アイテムスクリプトの方で、
134
-
135
- CIアニメのSetBoolに関与できていることを参考に以下のように書き換えましたが、
136
-
137
- 同じエラーが出ます。
138
-
139
- ```C#
140
-
141
- if(Sas.SetBool("isA,true))
115
+ エラーは出ませんが、Debug.Logが表示されません。
142
-
143
- {}
144
-
145
- ```
146
116
 
147
117
  ### 今まで自分ができたこと
148
118