質問編集履歴

3

自己解決したので内容を書き換えました。

2020/02/15 02:23

投稿

Kageyama_23457
Kageyama_23457

スコア21

test CHANGED
File without changes
test CHANGED
@@ -1,46 +1,32 @@
1
- ★2月1日 手元で模索状況が変わったので諸々書き換えました。
1
+ ★2月1日 自己解決したので書き換えました。
2
2
 
3
3
 
4
4
 
5
5
  ### 前提
6
6
 
7
- Unity、C#ともに初心者なので、至らぬ点あるかと思いご容赦ください
7
+ Unity、C#ともに初心者なので不合理ななどあるかもしれせん、一応自己解決したので反映しました
8
8
 
9
9
  Unityの3Dモードでタテスクロールの、障害物競争のようなゲームを作っています。
10
10
 
11
11
  CPUに擬似AIのような挙動を取らせたく模索しております。
12
12
 
13
-
13
+ 結局「親スクリプトから子スクリプトのboolを取得して、親スクリプトに挙動を記述し動かす」のではなく、
14
+
14
-
15
+ 「子スクリプトから親オブジェクトを動かす」かたちになりました。
16
+
17
+
18
+
15
- ###現状
19
+ ###構造
16
-
17
- 見辛いと思いますが解説させていただきます。
18
20
 
19
21
  CPUキャラ(親)と、障害物やアイテム検知用の空のGameObject(子)があり、それぞれ
20
22
 
21
23
  親:Rigidbody2D,collider2D,スクリプト「CPU」
22
24
 
23
- 子:collider2D,スクリプト「Kenchi」 を持っています。
25
+ 子:collider2D(IsTrigger),スクリプト「Kenchi」 を持っています。
24
-
25
-
26
-
27
- ![イメージ説明](a1d948e5b2b869172a3b9330381ce7cb.png)
26
+
28
-
29
-
30
-
31
- ・親のスクリプト上で子オブジェクトを取得する、
27
+
32
-
33
- ・子のスクリプトに、衝突判定を用いたpublic boolを記述
28
+
34
-
35
- まではできています。
36
-
37
- 困っているのは親スクリプトから子スクリプトのpublic boolを取得できないという点です。
38
-
39
- 以下両スクリプトを載せます。
40
-
41
-
42
-
43
- 親スクリプト「CPU」※長いので関係個所のみ抜粋
29
+ 親スクリプト「CPU」※関係個所のみ抜粋
44
30
 
45
31
  ```C#
46
32
 
@@ -56,37 +42,23 @@
56
42
 
57
43
  {
58
44
 
59
- private GameObject Kenchi_Object;
45
+ public GameObject Kenchi_Object;//インスペクタで各CPUキャラ専用の子オブジェクトを取得
46
+
47
+ public float Speed;//インスペクタで各CPUキャラの通常時の移動速度を入力
60
48
 
61
49
 
62
50
 
63
51
  void Start()
64
52
 
65
- {
53
+ {}
66
-
67
- Kenchi_Object = transform.GetChild(0).gameObject;//★参考サイト様の方法で取得しました
68
-
69
- }
70
54
 
71
55
  void Update()
72
56
 
73
57
  {
74
58
 
75
- kibakoMove();
76
-
77
- }
78
-
79
- private void kibakoMove()
80
-
81
- {
82
-
83
- if(Kenchi_Object!=null)
59
+ Kenchi kenchi=Kenchi_Object.GetComponent<Kenchi>();//子オブジェクトのスクリプトを取得
84
-
85
- {
60
+
86
-
87
- Debug.Log("木箱で進めない!");
88
-
89
- }//★ゲームを実行してデバッグを確認し、少なくともオブジェクトを取得できていることは確認できました。
61
+ isKIBAKO=kenchi.IsKIBAKO();//子リプ内のboolを取得
90
62
 
91
63
  }
92
64
 
@@ -94,7 +66,7 @@
94
66
 
95
67
  ```
96
68
 
97
- 子スクリプト「Kenchi」※短いで全文
69
+ 子スクリプト「Kenchi」※関係個所み抜粋
98
70
 
99
71
  ```C#
100
72
 
@@ -112,25 +84,15 @@
112
84
 
113
85
  private GameObject Kenchi_Object;
114
86
 
115
- private Rigidbody2D cpu;
116
-
117
- private string ochaTag = "Ocha";//お茶(加速アテム)
87
+ public Rigidbody2D chara;//インスペクで各親キャラを取得
118
-
88
+
119
- private string hazureTag = "Hazure";//ハズレアテム障害物タグ
89
+ public float Speed;//インスペクタで各親キャラの通常時の移動速度を入力親スクリプトのものと同じにする
120
-
121
- private string standATag = "StandA";//アビリティタグ
90
+
122
-
123
- private string kurumaTag = "kuruma";//車(障害物)タグ
91
+
124
92
 
125
93
  private string kibakoTag = "kibako";//木箱(障害物)タグ
126
94
 
127
-
128
-
129
- public bool hakken_kibako;
130
-
131
- public bool hakken_ocha;
132
-
133
- public bool hakken_StandA;//木箱、お茶、アビリティ検知bool、車とハズレと他キャラについては保留
95
+ public bool hakken_kibako_E,hakken_kibako_S,hakken_kibako_X;//障害物タグとの当たり判定のbool
134
96
 
135
97
 
136
98
 
@@ -140,13 +102,51 @@
140
102
 
141
103
  Kenchi_Object = GetComponent<GameObject>();//自身のインスタンスを取得
142
104
 
143
- cpu = GetComponentInParent<Rigidbody2D>();
105
+ CPU CPUScript=chara.GetComponent<CPU>();//現在は使用していませんが、とりあえず各親キャラのスクリプトを取得
144
-
106
+
145
- }
107
+ }
108
+
109
+
110
+
146
-
111
+ public bool IsKIBAKO()
112
+
147
-
113
+ {
114
+
148
-
115
+ if(hakken_kibako_E||hakken_kibako_S)
116
+
117
+ {
118
+
119
+ isKIBAKO = true;
120
+
121
+ chara.velocity = new Vector2(1 * Speed,0);//親オブジェクトにx速度を与える。これでは不十分なので、ここの挙動は模索中です。
122
+
123
+ }
124
+
125
+ else if(hakken_kibako_X)
126
+
127
+ {
128
+
129
+ isKIBAKO = false;
130
+
131
+ chara.velocity = new Vector2(Speed, -1 * Speed);//通常に戻って走行
132
+
133
+ }
134
+
135
+
136
+
137
+ hakken_kibako_E = false;
138
+
139
+ hakken_kibako_S = false;
140
+
141
+ hakken_kibako_X = false;
142
+
143
+ return isKIBAKO;
144
+
145
+ }
146
+
147
+
148
+
149
- public void OnTriggerEnter2D(Collider2D collision)
149
+ private void OnTriggerEnter2D(Collider2D collision)
150
150
 
151
151
  {
152
152
 
@@ -154,27 +154,39 @@
154
154
 
155
155
  {
156
156
 
157
- hakken_kibako = true;
157
+ hakken_kibako_E = true;
158
-
159
- //Debug.Log("木箱接近");
158
+
160
-
161
- }
159
+ }
160
+
162
-
161
+ }
162
+
163
+
164
+
163
- if(collision.gameObject.tag=="Ocha")
165
+ public void OnTriggerStay2D(Collider2D collision)
164
-
166
+
165
- {
167
+ {
168
+
166
-
169
+ if (collision.gameObject.tag == "kibako")
170
+
171
+ {
172
+
167
- hakken_ocha = true;
173
+ hakken_kibako_S = true;
168
-
169
- //Debug.Log("お茶発見");
174
+
170
-
171
- }
175
+ }
176
+
172
-
177
+ }
178
+
179
+
180
+
173
- if(collision.gameObject.tag=="StandA")
181
+ public void OnTrrigerExit2D(Collider2D collision)
174
-
182
+
175
- {
183
+ {
184
+
176
-
185
+ if (collision.gameObject.tag == "kibako")
186
+
187
+ {
188
+
177
- hakken_StandA = true;
189
+ hakken_kibako_X = true;
178
190
 
179
191
  }
180
192
 
@@ -188,65 +200,25 @@
188
200
 
189
201
  ###参考サイト様
190
202
 
191
- [参考サイト様①](http://kurowassan-app.fem.jp/wordpress/archives/1390/) (親スクリプトから子オブジェクトを取得する方法について
192
-
193
- [参考サイト様②](https://gomafrontier.com/unity/382) 親スクリプトからリプトのpublic boolを取得する記述部分を真似させいただきましたが、以下の通りエラーが出ます。
194
-
195
-
196
-
197
- ###試したこと
198
-
199
- 参考サイト様②で拝見したので、親スクリプトのif節を
200
-
201
- if(Kenchi_Object.hakken_kibako)
202
-
203
- と書いたところCS1061: 'GameObject' does not contain a definition for 'hakken_kibako' and no accessible extension method 'hakken_kibako' accepting a first argument of type 'GameObject' could be found (are you missing a using directive or an assembly reference?)が出ました。
204
-
205
-
206
-
207
- そもそも根本的な質問になるのですが、
208
-
209
- CPUオブジェクトと空のオブジェクトは親子関係であっても、
210
-
211
- CPUオブジェクト及びCPUスクリプトから見た子スクリプトは親子関係ではないのでしょうか?
212
-
213
- あるいは子オブジェクト所有のスクリプトということで孫になるのでしょうか?
214
-
215
- いずれにせよpubli boolの取得の記述方法がわからないので、
216
-
217
- ご教授いただきたく存じます。
218
-
219
-
220
-
221
- また、以前ご教授頂き、親スクリプトのkibakoMoveスコープにて
222
-
223
- Kenchi Script = GetComponentInChildren<Kenchi>();
224
-
225
- このように子スクリプトを取得しようとしところ、以下のエラーが出ました。
226
-
227
- こちらについては何を言われているのか見当がつきません… ご教授頂きたく存じます。
228
-
229
-
230
-
231
- ArgumentException: GetComponent requires that the requested component 'GameObject' derives from MonoBehaviour or Component or is an interface.
232
-
233
- UnityEngine.Component.GetComponentInChildren (System.Type t, System.Boolean includeInactive) (at /Users/builduser/buildslave/unity/build/Runtime/Export/Scripting/Component.bindings.cs:67)
234
-
235
- UnityEngine.Component.GetComponentInChildren[T] () (at /Users/builduser/buildslave/unity/build/Runtime/Export/Scripting/Component.bindings.cs:84)
236
-
237
- CPU.Start () (at Assets/script/CPU.cs:29)
203
+ [参考サイト様①](http://www.cho-design-lab.com/2013/08/18/unity-reference-other-script/) オブジェクトのスクリプト参照する方法について
204
+
205
+ [参考サイト様②](https://dkrevel.com/makegame-beginner/make-2d-action-ground) 親子オブジェクトの連結記述につい
238
206
 
239
207
 
240
208
 
241
209
  ###実現したいこと
242
210
 
211
+ 全て、以上に書いた「子スクリプトから親オブジェクトを動かす」という方法になるかとは思うのですが、
212
+
213
+ ・前方に障害物があったら避ける
214
+
215
+ ・前方に加速アイテムなど有益なアイテムがあったら取りに行く
216
+
243
- CPUキャラの親スクリプトAと子スクリプトBを連携させて、擬似AIのような挙動を取らせたいです。
217
+ など、擬似AIのような挙動を取らせたいです。
244
-
218
+
245
- 数日前以下にて質問させて頂いのですが、模索中に問題が発生したので、こ度別ページ書かせて頂きした
219
+ 子スクリプト内のコメントも書きましたが、現在挙動はまだまだ不十分なで模索続け
246
-
247
-
248
-
220
+
249
- [同質問者のページ「Unity2Dタテスクロール障害物競争 Z軸のな環境で、CPUキャラにAI的な移動をさせい」](https://teratail.com/questions/239469)
221
+ ご覧くださましてありがとうございまし
250
222
 
251
223
 
252
224
 
@@ -266,12 +238,14 @@
266
238
 
267
239
  ・カメラのプレイヤー追従(y軸のみ)
268
240
 
241
+ ・加速アイテム実装
242
+
269
243
  ・オブジェクトのランダム座標生成、及びランダムな方向への移動
270
244
 
271
- ・加速アイテム実装
272
-
273
245
  ・Gridを使いTileMapで背景を塗りました
274
246
 
247
+ ・CPUキャラの親オブジェクトと検知用子オブジェクトの連携(当ページ)
248
+
275
249
 
276
250
 
277
251
  ここまで同じゲームで質問させて頂き、解決に至るご教授を頂いておりますので、

2

手元で試行し状況が変わったのと、質問が冗長な気がしたので図説も入れて直しました。

2020/02/15 02:23

投稿

Kageyama_23457
Kageyama_23457

スコア21

test CHANGED
@@ -1 +1 @@
1
- Unity 親オブジェクトのスクリプトから子オブジェクトのスクリプト及び内部のpublic boolを参照したい
1
+ Unity 親要素のスクリプトから子要素のスクリプトのpublic boolを取得したい
test CHANGED
@@ -1,456 +1,228 @@
1
+ ★2月13日 手元で模索し状況が変わったので諸々書き換えました。
2
+
3
+
4
+
1
5
  ### 前提
2
6
 
3
7
  Unity、C#ともに初心者なので、至らぬ点あるかと思いますがご容赦ください。
4
8
 
5
9
  Unityの3Dモードでタテスクロールの、障害物競争のようなゲームを作っています。
6
10
 
7
- 3Dモードですがz軸は使用してせん。コースはy軸を下にゴールまで走行します。
8
-
9
- 以下の図のように、CPUキャラがいて(赤、スクリプトAとカプセルコライダ2D持ち)、
10
-
11
- 前方の障害物やアイテム検知用の空のオブジェクトを子オブジェクトとして持たせ(青)、
12
-
13
- ボックスコライダ2D、スクリプトBを持たせています。
14
-
15
- ボックスコライダはOnTriggerにチェックを入ています。
16
-
17
-
18
-
19
- ![イメージ説明](9b0ec61288271238663f2ac046ebdee7.jpeg)
20
-
21
-
22
-
23
- ### 発生している問題・エラーッセージ
24
-
25
- ゲームを実行すると、実行自体はできるものの、Unity側で下記エラーが出ます。VSではエラーは出ません。
26
-
27
- 親スクリプトからリプ内のboolが参照できていない(もしかすると子スクリプト自体も参照できていない)」ということかと思いこの度質問させて頂いたのですが、解釈は合っていますでしょうか?
28
-
29
-
30
-
31
- NullReferenceException: Object reference not set to an instance of an object
32
-
33
- CPU.kibakoMove () (at Assets/script/CPU.cs:106)
34
-
35
- CPU.Update () (at Assets/script/CPU.cs:41)
11
+ CPUに擬似AIのような挙動を取らせたく模索しております。
12
+
13
+
14
+
15
+ ###現状
16
+
17
+ 見辛い思いますが解説させていただきます。
18
+
19
+ CPUキャ(親)と、障害物やアテム検知用の空のGameObject(子)があり、そぞれ
20
+
21
+ 親:Rigidbody2D,collider2D,スクリプト「CPU」
22
+
23
+ 子:collider2D,スクリプト「Kenchi」 を持っています。
24
+
25
+
26
+
27
+ ![イメージ説明](a1d948e5b2b869172a3b9330381ce7cb.png)
28
+
29
+
30
+
31
+ スクリプト上でオブジェクトを取得する、
32
+
33
+ ・子のスクリプトに、衝突判定を用いたpublic boolを記述
34
+
35
+ まではできています。
36
+
37
+ 困っているのは親スクリプトから子スクリプトのpublic boolを取得できないという点です。
38
+
39
+ 以下両スクリプトを載せます。
40
+
41
+
42
+
43
+ 親スクリプト「CPU」※長いので関係個所のみ抜粋
44
+
45
+ ```C#
46
+
47
+ using System.Collections;
48
+
49
+ using System.Collections.Generic;
50
+
51
+ using UnityEngine;
52
+
53
+
54
+
55
+ public class CPU : MonoBehaviour
56
+
57
+ {
58
+
59
+ private GameObject Kenchi_Object;
60
+
61
+
62
+
63
+ void Start()
64
+
65
+ {
66
+
67
+ Kenchi_Object = transform.GetChild(0).gameObject;//★参考サイト様の方法で取得しました
68
+
69
+ }
70
+
71
+ void Update()
72
+
73
+ {
74
+
75
+ kibakoMove();
76
+
77
+ }
78
+
79
+ private void kibakoMove()
80
+
81
+ {
82
+
83
+ if(Kenchi_Object!=null)
84
+
85
+ {
86
+
87
+ Debug.Log("木箱で進めない!");
88
+
89
+ }//★ゲームを実行してデバッグを確認し、少なくとも子オブジェクトを取得できていることは確認できました。
90
+
91
+ }
92
+
93
+ }
94
+
95
+ ```
96
+
97
+ 子スクリプト「Kenchi」※短いので全文
98
+
99
+ ```C#
100
+
101
+ using System.Collections;
102
+
103
+ using System.Collections.Generic;
104
+
105
+ using UnityEngine;
106
+
107
+
108
+
109
+ public class Kenchi : MonoBehaviour
110
+
111
+ {
112
+
113
+ private GameObject Kenchi_Object;
114
+
115
+ private Rigidbody2D cpu;
116
+
117
+ private string ochaTag = "Ocha";//お茶(加速アイテム)タグ
118
+
119
+ private string hazureTag = "Hazure";//ハズレアイテム(障害物)タグ
120
+
121
+ private string standATag = "StandA";//アビリティタグ
122
+
123
+ private string kurumaTag = "kuruma";//車(障害物)タグ
124
+
125
+ private string kibakoTag = "kibako";//木箱(障害物)タグ
126
+
127
+
128
+
129
+ public bool hakken_kibako;
130
+
131
+ public bool hakken_ocha;
132
+
133
+ public bool hakken_StandA;//木箱、お茶、アビリティ検知bool、車とハズレと他キャラについては保留
134
+
135
+
136
+
137
+ void Start()
138
+
139
+ {
140
+
141
+ Kenchi_Object = GetComponent<GameObject>();//自身のインスタンスを取得
142
+
143
+ cpu = GetComponentInParent<Rigidbody2D>();
144
+
145
+ }
146
+
147
+
148
+
149
+ public void OnTriggerEnter2D(Collider2D collision)
150
+
151
+ {
152
+
153
+ if (collision.gameObject.tag == "kibako")
154
+
155
+ {
156
+
157
+ hakken_kibako = true;
158
+
159
+ //Debug.Log("木箱接近");
160
+
161
+ }
162
+
163
+ if(collision.gameObject.tag=="Ocha")
164
+
165
+ {
166
+
167
+ hakken_ocha = true;
168
+
169
+ //Debug.Log("お茶発見");
170
+
171
+ }
172
+
173
+ if(collision.gameObject.tag=="StandA")
174
+
175
+ {
176
+
177
+ hakken_StandA = true;
178
+
179
+ }
180
+
181
+ }
182
+
183
+ }
184
+
185
+ ```
186
+
187
+
36
188
 
37
189
  ###参考サイト様
38
190
 
191
+ [参考サイト様①](http://kurowassan-app.fem.jp/wordpress/archives/1390/) (親スクリプトから子オブジェクトを取得する方法について)
192
+
39
- [参考サイト様](https://gomafrontier.com/unity/382)
193
+ [参考サイト様](https://gomafrontier.com/unity/382) 親スクリプトから子スクリプトのpublic boolを取得する記述部分を真似させていただきましたが、以下の通りエラーが出ます。
40
-
41
- [参考サイト様②](https://htsuda.net/archives/1702)
194
+
42
-
43
- ### 該当のソースコード
195
+
44
-
45
-
46
-
47
- スクリプトA(親オブジェクトのスクリプト) 長くて申し訳ございませんがまるまんま載せます。
48
-
49
- ★のところが今回の質問に関係ある行です。
50
-
51
- ```C#
52
-
53
- using System.Collections;
54
-
55
- using System.Collections.Generic;
56
-
57
- using UnityEngine;
58
-
59
-
60
-
61
- public class CPU : MonoBehaviour
62
-
63
- {
64
-
65
- public float ySpeed;//基本的にはy軸直線移動
66
-
67
- public float xSpeed;
68
-
69
- public float KasokuSpeed;//インスペクタで加速度をいじくる(通常の移動速度に掛け算)
70
-
71
- public int KasokuTime;//インスペクタで加速持続時間をいじくる
72
-
73
-
74
-
75
- private string ochaTag = "Ocha";//お茶タグ
76
-
77
- private string hazureTag = "Hazure";//ハズレアイテムタグ
78
-
79
- private string standATag = "StandA";//アビリティタグ
80
-
81
- private string kurumaTag = "kuruma";//車タグ
82
-
83
- private string kibakoTag = "kibako";//木箱タグ、将来的には家とかになるはず
84
-
85
-
86
-
87
- private bool isKasoku = false;//加速boolを宣言、通常は加速してないよ
88
-
89
- private bool isDown = false;//ダウンbool、通常はオフ
90
-
91
-
92
-
93
- Rigidbody2D rb;
94
-
95
- GameObject KenchiObject;//★ GameObjectであれば他のものもここで定義可能
96
-
97
-
98
-
99
- // Use this for initialization
100
-
101
- void Start()
102
-
103
- {
104
-
105
- rb = GetComponent<Rigidbody2D>();
106
-
107
- KenchiObject = this.GetComponentInChildren<GameObject>();/*★
108
-
109
- 参考サイト様①では、<>内は子オブジェクトの固有の名前なのですが、
110
-
111
- 手元でそのように書くとVSにて「型または名前空間の名前 'Kenchi_Object' (←当方固有の名前)が見つかりませんでした
112
-
113
- (using ディレクティブまたはアセンブリ参照が指定されていることを確認してください)。」
114
-
115
- とエラーが出ます。
116
-
117
- GameObjectと書いて、後々他のGameObjectを誤って参照などないのかと心配です。*/
118
-
119
- }
120
-
121
-
122
-
123
- // Update is called once per frame
124
-
125
- void Update()
126
-
127
- {
128
-
129
- ChangeSpeed();
130
-
131
- kibakoMove();//★ エラー当該行
132
-
133
- //ochaMove();
134
-
135
- //StandAMove();//★ 下のChangeSpeedのように、それぞれ独立したスコープを作った方がいいかと思い書きました。
136
-
137
-
138
-
139
- transform.localPosition = gamen.ClampPosition(transform.localPosition);
140
-
141
- }
142
-
143
-
144
-
145
- void ChangeSpeed()
146
-
147
- {
148
-
149
- if (isKasoku == true)//お茶を取ったときの挙動
150
-
151
- {
152
-
153
- rb.velocity = new Vector2(xSpeed, ySpeed * KasokuSpeed);//移動速度がn倍になる(通常速度の違う他キャラも増やすので、この方が汎用性があります)
154
-
155
- }
156
-
157
- else if (isKasoku == false)//取ってないときの挙動
158
-
159
- {
160
-
161
- rb.velocity = new Vector2(xSpeed, ySpeed);//通常時の速度
162
-
163
- }
164
-
165
-
166
-
167
- if (isDown == true)//車とぶつかったときの挙動
168
-
169
- {
170
-
171
- rb.velocity = new Vector2(0, 0); //移動不能(操作不能)
172
-
173
- //ここにダウンアニメを記述する
174
-
175
- }//以下にisDownのfalseは不要。お茶のboolと競合してお茶で加速しなくなる。
176
-
177
- }
178
-
179
-
180
-
181
- IEnumerator Kasoku()//加速コルーチン(アイテムを取ってn秒後に効果が切れるという流れ)
182
-
183
- {
184
-
185
- isKasoku = true;//①加速スタート
186
-
187
-
188
-
189
- yield return new WaitForSeconds(KasokuTime);//②加速アイテムの持続時間(5秒持続)
190
-
191
-
192
-
193
- isKasoku = false;//③加速終了
194
-
195
- }
196
-
197
-
198
-
199
- IEnumerator down()//ダウンコルーチン(車とぶつかって数秒操作無効になり復帰する流れ)
200
-
201
- {
202
-
203
- isDown = true;//①ダウンスタート
204
-
205
-
206
-
207
- yield return new WaitForSeconds(3);//②ダウン継続時間(3秒)
208
-
209
-
210
-
211
- isDown = false;//③ダウン終了(復帰)
212
-
213
- }
214
-
215
-
216
-
217
- private void OnCollisionEnter2D(Collision2D collision)//衝突判定
218
-
219
- {
220
-
221
- if (collision.gameObject.tag == ochaTag)//お茶タグとぶつかったら
222
-
223
- {
224
-
225
- StartCoroutine(Kasoku());//上記加速コルーチンの開始
226
-
227
- Destroy(collision.gameObject);//お茶が消えるよ
228
-
229
- }
230
-
231
- if (collision.gameObject.tag == kurumaTag)//車タグとぶつかったら
232
-
233
- {
234
-
235
- StartCoroutine(down());//ダウンコルーチンの開始
236
-
237
- Destroy(collision.gameObject);//車が消えるよ
238
-
239
- }
240
-
241
- }
242
-
243
-
244
-
245
- void kibakoMove()
246
-
247
- {
248
-
249
- Kenchi Script = GetComponent<Kenchi>();//★ 参考サイト様②を元にこのように書きました
250
-
251
- float angle = Random.Range(270,90);
252
-
253
- float rad = angle * Mathf.Deg2Rad;
254
-
255
- double addforceX = Mathf.Sin((rad) * 1);
256
-
257
- Vector2 moveVector=new Vector2((float)addforceX, ySpeed);
258
-
259
-
260
-
261
- if (Script.hakken_kibako == true)//★ エラー当該行
262
-
263
- {
264
-
265
- rb.velocity = moveVector * xSpeed;
266
-
267
- }
268
-
269
- }
270
-
271
- }
272
-
273
-
274
-
275
- /*void ochaMove()
276
-
277
- {
278
-
279
- Kenchi KScript = GetComponent<Kenchi>();
280
-
281
- if (KScript.hakken_ocha == true)
282
-
283
- { }
284
-
285
- }仮置き*/
286
-
287
- }
288
-
289
-
290
-
291
-
292
-
293
- /*現在、①y軸スクロール速度の指定 ②自機キャラ同様加速アイテムで加速 ③車でダウン までできている。
294
-
295
- */
296
-
297
-
298
-
299
- ```
300
-
301
- スクリプトB(子オブジェクトのスクリプト) こちらについては今回エラーは出ません。
302
-
303
- ```C#
304
-
305
- using System.Collections;
306
-
307
- using System.Collections.Generic;
308
-
309
- using UnityEngine;
310
-
311
-
312
-
313
- public class Kenchi : MonoBehaviour
314
-
315
- {
316
-
317
- private Rigidbody2D cpu;
318
-
319
- private string ochaTag = "Ocha";//お茶タグ
320
-
321
- private string hazureTag = "Hazure";//ハズレアイテムタグ 避ける避けないがAIの頭のよさとして表現できるか
322
-
323
- private string standATag = "StandA";//アビリティタグ
324
-
325
- private string kurumaTag = "kuruma";//車タグ
326
-
327
- private string kibakoTag = "kibako";//木箱タグ、将来的には家とかになるはず
328
-
329
- //以下、弾き判定3段階用のタグをつけるかも
330
-
331
-
332
-
333
- public bool hakken_kibako;
334
-
335
- public bool hakken_ocha;
336
-
337
- public bool hakken_StandA;//木箱、お茶、アビリティ検知bool、車とハズレと他キャラについては保留
338
-
339
-
340
-
341
- void Start()
342
-
343
- {
344
-
345
- cpu = GetComponentInParent<Rigidbody2D>();
346
-
347
- }
348
-
349
-
350
-
351
- public void OnTriggerEnter2D(Collider2D collision)
352
-
353
- {
354
-
355
- if (collision.gameObject.tag == "kibako")
356
-
357
- {
358
-
359
- hakken_kibako = true;
360
-
361
- Debug.Log("木箱接近");
362
-
363
- }
364
-
365
- if(collision.gameObject.tag=="Ocha")
366
-
367
- {
368
-
369
- hakken_ocha = true;
370
-
371
- Debug.Log("お茶発見");
372
-
373
- }
374
-
375
- if(collision.gameObject.tag=="StandA")
376
-
377
- {
378
-
379
- hakken_StandA = true;
380
-
381
- }
382
-
383
- }
384
-
385
-
386
-
387
- public void OnTriggerStay2D(Collider2D collision)
388
-
389
- {
390
-
391
- if (collision.gameObject.tag == "kibako")
392
-
393
- {
394
-
395
- hakken_kibako = true;
396
-
397
- Debug.Log("木箱まだある");
398
-
399
- }
400
-
401
- }
402
-
403
-
404
-
405
- public void OnTrrigerExit2D(Collider2D collision)//離れる系のデバッグが表示されない=Exitが働いてない?
406
-
407
- {
408
-
409
- if (collision.gameObject.tag == "kibako")
410
-
411
- {
412
-
413
- hakken_kibako = false;
414
-
415
- Debug.Log("木箱回避");
416
-
417
- }
418
-
419
- if(collision.gameObject.tag=="Ocha")
420
-
421
- {
422
-
423
- hakken_ocha = false;
424
-
425
- Debug.Log("お茶離れる");
426
-
427
- }
428
-
429
- if(collision.gameObject.tag=="StandA")
430
-
431
- {
432
-
433
- hakken_StandA = false;
434
-
435
- }
436
-
437
- }
438
-
439
- }
440
-
441
-
442
-
443
- ```
444
196
 
445
197
  ###試したこと
446
198
 
447
- ご教授頂き、親スクリプトのkibakoMoveスコープの
448
-
449
- Kenchi Script = GetComponent<Kenchi>(); を
450
-
451
- Kenchi Script = GetComponentInChildren<Kenchi>(); に書き換えところ、
452
-
453
- 依然ゲームは動くものの、今度は以下のエラーが出ました。
199
+ 参考サイト様②で拝見したので、親スクリプトのif節を
200
+
201
+ if(Kenchi_Object.hakken_kibako)
202
+
203
+ と書いたところCS1061: 'GameObject' does not contain a definition for 'hakken_kibako' and no accessible extension method 'hakken_kibako' accepting a first argument of type 'GameObject' could be found (are you missing a using directive or an assembly reference?)が出まし
204
+
205
+
206
+
207
+ そもそも根本的な質問になるのですが、
208
+
209
+ CPUオブジェクトと空のオブジェクトは親子関係であっても、
210
+
211
+ CPUオブジェクト及びCPUスクリプトから見た子スクリプトは親子関係ではないのでしょうか?
212
+
213
+ あるいは子オブジェクト所有のスクリプトということで孫になるのでしょうか?
214
+
215
+ いずれにせよpubli boolの取得の記述方法がわからないので、
216
+
217
+ ご教授いただきたく存じます。
218
+
219
+
220
+
221
+ また、以前ご教授頂き、親スクリプトのkibakoMoveスコープにて
222
+
223
+ Kenchi Script = GetComponentInChildren<Kenchi>();
224
+
225
+ このように子スクリプトを取得しようとしところ、以下のエラーが出ました。
454
226
 
455
227
  こちらについては何を言われているのか見当がつきません… ご教授頂きたく存じます。
456
228
 
@@ -466,20 +238,12 @@
466
238
 
467
239
 
468
240
 
469
-
470
-
471
-
472
-
473
241
  ###実現したいこと
474
242
 
475
243
  CPUキャラの親スクリプトAと子スクリプトBを連携させて、擬似AIのような挙動を取らせたいです。
476
244
 
477
- (例:上記図のように障害物が近づいたら回避、有益なアイテムが近づいたら取りに行く、など)
478
-
479
245
  数日前に以下にて質問させて頂いたのですが、模索中に問題が発生したので、この度別ページを書かせて頂きました。
480
246
 
481
- ご教授頂きたく存じます。
482
-
483
247
 
484
248
 
485
249
  [同質問者のページ「Unity2Dタテスクロール障害物競争 Z軸のない環境で、CPUキャラにAI的な移動をさせたい」](https://teratail.com/questions/239469)
@@ -506,7 +270,7 @@
506
270
 
507
271
  ・加速アイテム実装
508
272
 
509
- ・Gridを使いTileMapで背景を塗りました。当ゲームにおいてはこれがフィールドという概念になります。
273
+ ・Gridを使いTileMapで背景を塗りました
510
274
 
511
275
 
512
276
 

1

回答を試したところ別のエラーが生じたので反映しました。

2020/02/13 13:19

投稿

Kageyama_23457
Kageyama_23457

スコア21

test CHANGED
File without changes
test CHANGED
@@ -442,6 +442,34 @@
442
442
 
443
443
  ```
444
444
 
445
+ ###試したこと
446
+
447
+ ご教授頂き、親スクリプトのkibakoMoveスコープの
448
+
449
+ Kenchi Script = GetComponent<Kenchi>(); を
450
+
451
+ Kenchi Script = GetComponentInChildren<Kenchi>(); に書き換えたところ、
452
+
453
+ 依然ゲームは動くものの、今度は以下のエラーが出ました。
454
+
455
+ こちらについては何を言われているのか見当がつきません… ご教授頂きたく存じます。
456
+
457
+
458
+
459
+ ArgumentException: GetComponent requires that the requested component 'GameObject' derives from MonoBehaviour or Component or is an interface.
460
+
461
+ UnityEngine.Component.GetComponentInChildren (System.Type t, System.Boolean includeInactive) (at /Users/builduser/buildslave/unity/build/Runtime/Export/Scripting/Component.bindings.cs:67)
462
+
463
+ UnityEngine.Component.GetComponentInChildren[T] () (at /Users/builduser/buildslave/unity/build/Runtime/Export/Scripting/Component.bindings.cs:84)
464
+
465
+ CPU.Start () (at Assets/script/CPU.cs:29)
466
+
467
+
468
+
469
+
470
+
471
+
472
+
445
473
  ###実現したいこと
446
474
 
447
475
  CPUキャラの親スクリプトAと子スクリプトBを連携させて、擬似AIのような挙動を取らせたいです。