質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

1131閲覧

unity 5.6: なぞったところをオブジェクト化したいです

Nippun

総合スコア1147

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

1クリップ

投稿2017/07/08 20:19

画面をなぞった線の部分をオブジェクト化したいです。イメージ的には"Q universe"のようなかんじです。

GameObject gObj = null; Ray GenerateMouseRay(Vector3 touchPos){ Vector3 mousePosFar = new Vector3 (touchPos.x, touchPos.y, Camera.main.farClipPlane); Vector3 mousePosNear = new Vector3 (touchPos.x, touchPos.y, Camera.main.nearClipPlane); Vector3 mousePosF = Camera.main.ScreenToWorldPoint (mousePosFar); Vector3 mousePosN = Camera.main.ScreenToWorldPoint (mousePosNear); Ray mr = new Ray (mousePosN, mousePosF - mousePosN); return mr; } void Update () { float rayDistance; if(((Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Moved) || Input.GetMouseButton(0))){ Plane objPlane = new Plane(Camera.main.transform.forward * -1, this.transform.position); Ray mRay = Camera.main.ScreenPointToRay(Input.mousePosition); if(objPlane.Raycast(mRay, out rayDistance)){ this.transform.position = mRay.GetPoint(rayDistance); } Ray mouseRay = GenerateMouseRay (Input.mousePosition); RaycastHit hit; if(Physics.Raycast(mouseRay.origin, mouseRay.direction, out hit)){ gObj = hit.transform.gameObject; } } } コード

このようにしてみましたが線は引けるのですがオブジェクト化できません。
どのようにすればいいですか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

イメージをそのままコードに殴り書きした感じなので読みにくいですが、参考程度にしてください。
カメラの前にPlaneを作成し、そこにカメラからマウスの位置へレイを飛ばして、その座標を元に
キューブを作成(ライン状)にするコードを書いてみました。
パネルを作る間隔を小さくすればそれだけ、当たり判定も細かく出来るでしょうが処理は重くなるかも?
∞のようにラインが重なるように書いた場合に、キューブの角度がおかしくなることがありますが、
その場合はレイを飛ばす瞬間だけ親オブジェクトを非表示にするなり、linemesh()の手前の条件分岐を工夫するなりしてみてください。

c#

1 float linerange = 0.3f; //パネルを作る間隔 2 Vector3 hitpoint_tmp; //レイが当たった座標の一時補間 3 bool input_sw = false; //マウスが押されているかどうかのスイッチ 4 int objNumber = 1; //空オブジェクトの個数(名前) 5 6 //マウス位置からレイを飛ばして壁に当たった際の座標 7 Vector3 MouseRay() 8 { 9 RaycastHit hit; 10 Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit, 100); 11 return hit.point; 12 } 13 14 //tmp座標と現在のマウスの位置の座標、その距離 15 void linemesh(Vector3 a, Vector3 b , float range) 16 { 17 //親オブジェクト 18 GameObject Motherobj = GameObject.Find(string.Format("LinePlane{0}", objNumber)); 19 20 //キューブを作成し、子オブジェクトして追加 21 Motherobj.transform.position = new Vector3(0,0,100); 22 GameObject Cube = GameObject.CreatePrimitive(PrimitiveType.Cube); 23 Cube.transform.parent = Motherobj.transform; 24 Motherobj.transform.position = new Vector3(0, 0, 0); 25 26 //キューブのスケールをtmpから現在地までの長さにし、tmpと現在地のマウスの角度を設定 27 Cube.transform.localScale = new Vector3(range,0,1); 28 float angl = Vector2.Angle(new Vector2(-1,0),new Vector2(a.x - b.x,a.y-b.y)); 29 if (a.y < b.y) Cube.transform.Rotate(new Vector3(0, 0, angl)); 30 else if(a.y > b.y) Cube.transform.Rotate(new Vector3(0, 0, angl * -1)); 31 32 Cube.transform.position = (a + b) / 2; 33 } 34 35 void Update() 36 { 37 if (Input.GetMouseButton(0)) 38 { 39 //スイッチがfalseであれば空の親オブジェクト(LinePlane{obgNumber})を作る 40 //hitpoint_tmpにレイが当たった座標を入れる、スイッチをtrueにする 41 if (input_sw == false) 42 { 43 new GameObject(string.Format("LinePlane{0}", objNumber)); 44 hitpoint_tmp = MouseRay(); 45 input_sw = true; 46 } 47 48 //tmpの座標と現在のマウスの位置から出ているレイの距離がlinerangeと等しいか大きい、なおかつスイッチがtureであればパネルを作成 49 if (Vector3.Distance(hitpoint_tmp, MouseRay()) >= linerange & input_sw == true) 50 { 51 linemesh(hitpoint_tmp, MouseRay(), Vector3.Distance(hitpoint_tmp, MouseRay())); 52 hitpoint_tmp = MouseRay(); 53 } 54 } 55 else if(input_sw == true) 56 { 57 input_sw = false; 58 objNumber += 1; 59 } 60 }

投稿2017/07/09 14:37

pikumin001

総合スコア132

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pikumin001

2017/07/09 14:48

LayerMaskを使うことでラインの重なり時の角度がおかしくなるのは回避できそうです。 試してみてください。
Nippun

2017/07/09 22:40

ありがとうございます。
guest

0

キューブなどを線の一定間隔の間に配置するというのはどうでしょうか?
先の上面に座標指定して面を作成するという手もあります。

投稿2017/07/08 22:28

pikumin001

総合スコア132

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Nippun

2017/07/09 00:19

ご回答ありがとうございます。 恐れ入りますがコードなどを見せていただけると助かります。
pikumin001

2017/07/09 19:22

レイヤーを追加していない場合ですが、生成したキューブのレイヤーをCube.layer = 2;とすると、 そのキューブのレイヤーが ignore raycastとなり、レイキャストがキューブにあたって角度がおかしくなることはありませんでした。 描画されるラインの厚さによってキューブの厚さを変える、高さや幅をかえると見た目もスムーズになると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問