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

回答編集履歴

2

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

2018/08/20 09:29

投稿

Bongo
Bongo

スコア10816

answer CHANGED
@@ -92,4 +92,71 @@
92
92
 
93
93
  こうするとラインとUIの位置関係は下図のようになり、カメラから5mの位置にUIが、10mの位置にラインが描画されるかと思います。
94
94
 
95
- ![Scene](2d7813768ee20e5ac03a110a424f7951.png)
95
+ ![Scene](2d7813768ee20e5ac03a110a424f7951.png)
96
+
97
+ #コメントを受けて追記
98
+
99
+ それでは、この`lineController`をアタッチしているオブジェクトを、カメラと連動して動くようにした上で、[useWorldSpace](https://docs.unity3d.com/ja/current/ScriptReference/LineRenderer-useWorldSpace.html)を`false`にしてみてはいかがでしょう。
100
+
101
+ ```C#
102
+ using System.Collections;
103
+ using System.Collections.Generic;
104
+ using UnityEngine;
105
+
106
+ public class lineController : MonoBehaviour
107
+ {
108
+ private LineRenderer lineRenderer;
109
+ private int index;
110
+ private Camera mainCamera;
111
+ // Use this for initialization
112
+ void Start()
113
+ {
114
+ lineRenderer = GetComponent<LineRenderer>();
115
+
116
+ // ラインの座標指定を、このラインオブジェクトのローカル座標系を基準にするよう設定を変更
117
+ // この状態でラインオブジェクトを移動・回転させると、描かれたラインもワールド空間に
118
+ // 取り残されることなく、一緒に移動・回転するはず
119
+ lineRenderer.useWorldSpace = false;
120
+
121
+ index = 0;
122
+ mainCamera = GameObject.FindWithTag("MainCamera").GetComponent<Camera>();
123
+ }
124
+
125
+ // Updateis called once per frame
126
+ void Update()
127
+ {
128
+ // このラインオブジェクトを、位置はカメラ前方10m、回転はカメラと同じになるようキープさせる
129
+ // スクリプトによる追従ではなく、ラインオブジェクトをカメラの子オブジェクトにする方式でもいいと思います
130
+ // その方がオブジェクトの位置をシーンビュー上で視覚的に調整できて好都合かもしれませんね
131
+ transform.position = mainCamera.transform.position + mainCamera.transform.forward * 10;
132
+ transform.rotation = mainCamera.transform.rotation;
133
+
134
+ // 簡略化して、「ボタンを押している間線を引く」パートのみにしました
135
+ //ボタンを押している間線を引く。
136
+ if (Input.GetMouseButton(0))
137
+ {
138
+ // 座標指定の設定をローカル座標系にしたため、与える座標にも手を加える
139
+ // まず先ほどと同じようにマウススクリーン座標をワールド座標に直し...
140
+ var pos = Input.mousePosition;
141
+ pos.z = 10.0f;
142
+ pos = mainCamera.ScreenToWorldPoint(pos);
143
+
144
+ // さらにそれをラインオブジェクトにおけるローカル座標に直し...
145
+ pos = transform.InverseTransformPoint(pos);
146
+
147
+ // 得られたローカル座標をラインレンダラーに追加する
148
+ index++;
149
+ lineRenderer.positionCount = index;
150
+ lineRenderer.SetPosition(index - 1, pos);
151
+ }
152
+ if (!(Input.GetMouseButton(0)))
153
+ {
154
+ index = 0;
155
+ }
156
+ }
157
+ }
158
+ ```
159
+
160
+ これで動かしてみたところ、マウスで線を描いた後にカメラを回転させても、画面内の描いた線の位置は一定になりました。
161
+
162
+ ![Scene](ac7db2e23fd59f2999b3371ab32ad161.gif)

1

useWorldSpaceについての記述を追加

2018/08/20 09:29

投稿

Bongo
Bongo

スコア10816

answer CHANGED
@@ -42,7 +42,7 @@
42
42
  // あるいは、こう書いてもよさそうです
43
43
  // var pos = mainCamera.ScreenToWorldPoint(Input.mousePosition + Vector3.forward * 10);
44
44
 
45
- // LineRendererのポジションはワールド座標系で指定するので、たとえLineRendererをアタッチしたオブジェクトが
45
+ // LineRendererのポジションはuseWorldSpaceがtrueの場合ワールド座標系で指定するので、たとえLineRendererをアタッチしたオブジェクトが
46
46
  // Canvas階層下に入っていたとしても、Canvasの位置・スケールによるポジション調整は不要なはず
47
47
  /*
48
48
  //調整のためcanvasのscaleのそれぞれの座標で割ったり、canvasのポジションを引いたりしている。(うまくいかない)