回答編集履歴

6

追記

2017/11/27 08:59

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -161,3 +161,105 @@
161
161
  }
162
162
 
163
163
  ```
164
+
165
+
166
+
167
+
168
+
169
+ ###(追記) 最も近いオブジェクトとそれ以外を分ける
170
+
171
+
172
+
173
+ ※コードは未検証です。挙動がおかしければご自分で修正してみてください。
174
+
175
+ ```C#
176
+
177
+ //serchTagが返すオブジェクトを定義
178
+
179
+ struct serchCallBackObj
180
+
181
+ {
182
+
183
+ public GameObject neartObj;
184
+
185
+ public GameObject[] otherObj;
186
+
187
+ }
188
+
189
+
190
+
191
+ void Start ()
192
+
193
+ {
194
+
195
+ serchCallBackObj objs = serchTag(gameObject, "Player");
196
+
197
+
198
+
199
+ //objs.neartObjで近いオブジェクトを取得
200
+
201
+ //objs.otherObjでそれ以外のオブジェクトが配列で格納
202
+
203
+ }
204
+
205
+
206
+
207
+ serchCallBackObj serchTag(GameObject nowObj, string Player)
208
+
209
+ {
210
+
211
+ float tmpDis = 0;
212
+
213
+ float nearDis = 0;
214
+
215
+
216
+
217
+ serchCallBackObj callBackOnj = new serchCallBackObj();
218
+
219
+ callBackOnj.otherObj = GameObject.FindGameObjectsWithTag(Player);
220
+
221
+
222
+
223
+ if (callBackOnj.otherObj == null
224
+
225
+ || callBackOnj.otherObj != null && callBackOnj.otherObj.Length == 0) return callBackOnj;
226
+
227
+
228
+
229
+ int neartObjIdx = 0;
230
+
231
+
232
+
233
+ for (int i = 0; i < callBackOnj.otherObj.Length; i++)
234
+
235
+ {
236
+
237
+ tmpDis = Vector3.Distance(callBackOnj.otherObj[i].transform.position, nowObj.transform.position);
238
+
239
+ if (nearDis == 0 || nearDis > tmpDis)
240
+
241
+ {
242
+
243
+ nearDis = tmpDis;
244
+
245
+ callBackOnj.neartObj = callBackOnj.otherObj[i];
246
+
247
+ neartObjIdx = i;
248
+
249
+ }
250
+
251
+ }
252
+
253
+
254
+
255
+ //一番近い要素を削除
256
+
257
+ System.Array.Clear(callBackOnj.otherObj, neartObjIdx, 1);
258
+
259
+
260
+
261
+ return callBackOnj;
262
+
263
+ }
264
+
265
+ ```

5

すみません。またまた修正です。

2017/11/27 08:59

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -116,6 +116,8 @@
116
116
 
117
117
  {
118
118
 
119
+ StopDistanceCorutine ();
120
+
119
121
  m_distanceCorutine = StartCoroutine ( DistanceCorutine() );
120
122
 
121
123
  }

4

追記、訂正

2017/11/24 07:47

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -84,7 +84,7 @@
84
84
 
85
85
  ###おまけ
86
86
 
87
- Updateは毎フレーム実行されるので少々高コストです。OO秒毎の実行でしたらCoroutineを使うといいと思います。
87
+ Updateは毎フレーム実行されるので少々高コストです。OO秒毎の実行でしたらCoroutineを使うといいと思います。Coroutineの注意点はゲームオブジェクトが非アクティブの時に実行するとエラーが出るので注意が必要です。
88
88
 
89
89
 
90
90
 
@@ -122,6 +122,8 @@
122
122
 
123
123
 
124
124
 
125
+ //ストップしたいときはこの関数を呼ぶ
126
+
125
127
  void StopDistanceCorutine ()
126
128
 
127
129
  {

3

訂正

2017/11/24 07:46

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -84,7 +84,7 @@
84
84
 
85
85
  ###おまけ
86
86
 
87
- Updateはフレーム毎に実行されるので少々高コストです。OO秒の実行でしたらCoroutineを使うといいと思います。参考までに
87
+ Updateはフレーム実行されるので少々高コストです。OO秒の実行でしたらCoroutineを使うといいと思います。
88
88
 
89
89
 
90
90
 

2

追記

2017/11/24 07:44

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -77,3 +77,83 @@
77
77
  List<string> SumAry2 = new List<string>();
78
78
 
79
79
  ```
80
+
81
+
82
+
83
+
84
+
85
+ ###おまけ
86
+
87
+ Updateはフレーム毎に実行されるので少々高コストです。OO秒枚の実行でしたらCoroutineを使うといいと思います。参考までに
88
+
89
+
90
+
91
+
92
+
93
+ ```C#
94
+
95
+ //ループ間隔をfloatで指定
96
+
97
+ static readonly float LOOP_INTERVAL = 1f;
98
+
99
+ Coroutine m_distanceCorutine;
100
+
101
+
102
+
103
+ void Start ()
104
+
105
+ {
106
+
107
+ //処理のスタート
108
+
109
+ StartDistanceCorutine ();
110
+
111
+ }
112
+
113
+
114
+
115
+ void StartDistanceCorutine ()
116
+
117
+ {
118
+
119
+ m_distanceCorutine = StartCoroutine ( DistanceCorutine() );
120
+
121
+ }
122
+
123
+
124
+
125
+ void StopDistanceCorutine ()
126
+
127
+ {
128
+
129
+ //nullの可能性があるのでnullチェック
130
+
131
+ if (m_distanceCorutine != null) StopCoroutine ( m_distanceCorutine );
132
+
133
+ }
134
+
135
+
136
+
137
+ IEnumerator DistanceCorutine()
138
+
139
+ {
140
+
141
+ var waitTime = new WaitForSeconds( LOOP_INTERVAL );
142
+
143
+ while (true)
144
+
145
+ {
146
+
147
+ yield return waitTime;
148
+
149
+
150
+
151
+ //LOOP_INTERVAL毎にここに記述した処理が実行されます
152
+
153
+
154
+
155
+ }
156
+
157
+ }
158
+
159
+ ```

1

修正

2017/11/24 07:43

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -54,7 +54,7 @@
54
54
 
55
55
  nullが存在する言語は常にnullを意識する必要があります。
56
56
 
57
- nullはクラッシュの原因になるのでできる限り初期値を設定するのがおすすめです。設定できないところは必ずnullチェックをするといいとす。
57
+ nullはクラッシュの原因になるのでできる限り初期値を設定するのがおすすめです。設定できないところは必ずnullチェックをするといいと思います。
58
58
 
59
59
 
60
60
 
@@ -62,7 +62,7 @@
62
62
 
63
63
  ```C#
64
64
 
65
- //数値は初期値が0なので代入の必要はありません
65
+ //数値は初期値が0なので初期化の必要はありません
66
66
 
67
67
  int SumNum;
68
68