回答編集履歴

2

ラインとカメラの位置関係を固定する案を追記

2018/08/20 09:29

投稿

Bongo
Bongo

スコア10807

test CHANGED
@@ -187,3 +187,137 @@
187
187
 
188
188
 
189
189
  ![Scene](2d7813768ee20e5ac03a110a424f7951.png)
190
+
191
+
192
+
193
+ #コメントを受けて追記
194
+
195
+
196
+
197
+ それでは、この`lineController`をアタッチしているオブジェクトを、カメラと連動して動くようにした上で、[useWorldSpace](https://docs.unity3d.com/ja/current/ScriptReference/LineRenderer-useWorldSpace.html)を`false`にしてみてはいかがでしょう。
198
+
199
+
200
+
201
+ ```C#
202
+
203
+ using System.Collections;
204
+
205
+ using System.Collections.Generic;
206
+
207
+ using UnityEngine;
208
+
209
+
210
+
211
+ public class lineController : MonoBehaviour
212
+
213
+ {
214
+
215
+ private LineRenderer lineRenderer;
216
+
217
+ private int index;
218
+
219
+ private Camera mainCamera;
220
+
221
+ // Use this for initialization
222
+
223
+ void Start()
224
+
225
+ {
226
+
227
+ lineRenderer = GetComponent<LineRenderer>();
228
+
229
+
230
+
231
+ // ラインの座標指定を、このラインオブジェクトのローカル座標系を基準にするよう設定を変更
232
+
233
+ // この状態でラインオブジェクトを移動・回転させると、描かれたラインもワールド空間に
234
+
235
+ // 取り残されることなく、一緒に移動・回転するはず
236
+
237
+ lineRenderer.useWorldSpace = false;
238
+
239
+
240
+
241
+ index = 0;
242
+
243
+ mainCamera = GameObject.FindWithTag("MainCamera").GetComponent<Camera>();
244
+
245
+ }
246
+
247
+
248
+
249
+ // Updateis called once per frame
250
+
251
+ void Update()
252
+
253
+ {
254
+
255
+ // このラインオブジェクトを、位置はカメラ前方10m、回転はカメラと同じになるようキープさせる
256
+
257
+ // スクリプトによる追従ではなく、ラインオブジェクトをカメラの子オブジェクトにする方式でもいいと思います
258
+
259
+ // その方がオブジェクトの位置をシーンビュー上で視覚的に調整できて好都合かもしれませんね
260
+
261
+ transform.position = mainCamera.transform.position + mainCamera.transform.forward * 10;
262
+
263
+ transform.rotation = mainCamera.transform.rotation;
264
+
265
+
266
+
267
+ // 簡略化して、「ボタンを押している間線を引く」パートのみにしました
268
+
269
+ //ボタンを押している間線を引く。
270
+
271
+ if (Input.GetMouseButton(0))
272
+
273
+ {
274
+
275
+ // 座標指定の設定をローカル座標系にしたため、与える座標にも手を加える
276
+
277
+ // まず先ほどと同じようにマウススクリーン座標をワールド座標に直し...
278
+
279
+ var pos = Input.mousePosition;
280
+
281
+ pos.z = 10.0f;
282
+
283
+ pos = mainCamera.ScreenToWorldPoint(pos);
284
+
285
+
286
+
287
+ // さらにそれをラインオブジェクトにおけるローカル座標に直し...
288
+
289
+ pos = transform.InverseTransformPoint(pos);
290
+
291
+
292
+
293
+ // 得られたローカル座標をラインレンダラーに追加する
294
+
295
+ index++;
296
+
297
+ lineRenderer.positionCount = index;
298
+
299
+ lineRenderer.SetPosition(index - 1, pos);
300
+
301
+ }
302
+
303
+ if (!(Input.GetMouseButton(0)))
304
+
305
+ {
306
+
307
+ index = 0;
308
+
309
+ }
310
+
311
+ }
312
+
313
+ }
314
+
315
+ ```
316
+
317
+
318
+
319
+ これで動かしてみたところ、マウスで線を描いた後にカメラを回転させても、画面内の描いた線の位置は一定になりました。
320
+
321
+
322
+
323
+ ![Scene](ac7db2e23fd59f2999b3371ab32ad161.gif)

1

useWorldSpaceについての記述を追加

2018/08/20 09:29

投稿

Bongo
Bongo

スコア10807

test CHANGED
@@ -86,7 +86,7 @@
86
86
 
87
87
 
88
88
 
89
- // LineRendererのポジションはワールド座標系で指定するので、たとえLineRendererをアタッチしたオブジェクトが
89
+ // LineRendererのポジションはuseWorldSpaceがtrueの場合ワールド座標系で指定するので、たとえLineRendererをアタッチしたオブジェクトが
90
90
 
91
91
  // Canvas階層下に入っていたとしても、Canvasの位置・スケールによるポジション調整は不要なはず
92
92