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

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

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

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

Unity

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

Q&A

解決済

2回答

1231閲覧

unityで線を引く

etcetera

総合スコア24

C#

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

Unity

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

0グッド

0クリップ

投稿2021/05/30 12:03

unity初心者です。ゲーム画面をなぞると線が引けるというプログラムを作ろうと思い、ネットで下記のコードを見つけたので参考にしたいのですが、わからないところがあるので質問させていただきます。
まず、obj.transform.right = (endPos - startPos).normalized; の部分です。このコードがベクトルを表してるということは調べてわかったのですが、具体的にそのベクトルがどのように使われているのかがいまいち理解できません。
次に、obj.transform.parent = this.transform; この部分の意味もよくわかりません。このthis.transformはスクリプトをアタッチしてるゲームオブジェクトのtransformオブジェクトという認識であっていますか?そこらへんも含めて解説していただけるとありがたいです。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Line : MonoBehaviour 6{ 7 public GameObject linePrefab; 8 public float lineLength = 0.2f; 9 public float lineWidth =0.5f; 10 11 private Vector3 touchPos; 12 13 void Start() 14 { 15 16 } 17 18 void Update() 19 { 20 drawLine(); 21 } 22 23 void drawLine() 24 { 25 26 if (Input.GetMouseButtonDown(0)) 27 { 28 touchPos = Camera.main.ScreenToWorldPoint(Input.mousePosition); 29 touchPos.z = 0; 30 } 31 32 if (Input.GetMouseButtonUp(0)) 33 { 34 35 Vector3 startPos = touchPos; 36 Vector3 endPos = Camera.main.ScreenToWorldPoint(Input.mousePosition); 37 endPos.z = 0; 38 39 if ((endPos - startPos).magnitude > lineLength) 40 { 41 GameObject obj = Instantiate(linePrefab, transform.position, transform.rotation) as GameObject; 42 obj.transform.position = (startPos + endPos) / 2; 43 obj.transform.right = (endPos - startPos).normalized; //大きさ1のベクトル 44 45 obj.transform.localScale = new Vector3((endPos - startPos).magnitude, lineWidth, 1); 46 47 obj.transform.parent = this.transform; 48 49 touchPos = endPos; 50 } 51 } 52 } 53} 54

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

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

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

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

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

guest

回答2

0

ベストアンサー

おそらくですが、以下の原因かと思います。

Unity Editor の仕様で、AssetsウインドウからスクリプトをInspectorにドラッグ&ドロップすると変数の初期値はスクリプトの値に設定されますが、Inspector内で一度でも値を編集するとそれ以降その値が優先されるようになっています。
その後にスクリプト側で変数の初期値を書き換えてファイルを上書きしても、Inspectorに見えている値になってしまいます。
プログラムで設定した初期値に戻したいときは、Inspectorのスクリプトの右上の ⠇メニューからResetを実行してください。
ただし、リセットすると指定していた Prefab も消えてしまいますから、再度指定が必要になります。

投稿2021/06/02 03:41

monmoko

総合スコア202

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

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

etcetera

2021/06/02 08:39

試してみましたが解決しませんでした。y軸方向のベクトルを定義してないのが問題なのかなと思ったのですが、関係ないですか?
monmoko

2021/06/02 12:43

私の環境では正しく動作しています。 説明が足りなかったかもしれませんので、念のため実行した手順を示します。 (1) 新規の「Basic 2D (Built-in)」シーンを作成 (2) Hierarchy ウィンドウで右クリックメニューからCreate Emptyを実行 (3) 作成された GameObject に「Line」スクリプトをドラッグ&ドロップ (4) Hierarchy ウィンドウで右クリックメニューから 2D Object -> Sprites -> Square を実行してスプライトを作る (5) 作成されたスプライトを Assets ウインドウにドラッグ&ドロップして prefab を作成 (6) Hierarchy ウィンドウに作成されたスプライトは右クリックメニューからDeleteを実行して削除 (7) Inspector の Line(Script)の Line Prefab に (5)で作成したprefabをドラッグ&ドロップして設定する (8) [⯈]ボタンをクリックしてプログラムを実行、マウスドラッグで線が描けることを確認し、 [⯈]ボタンをクリックしてプログラムを終了 (9) Inspector でLine Width を 0.1 に書き換え、再度プログラムを実行して線が細くなるのを確認 (10) Lineスクリプトの public float lineWidth = 0.5f; を public float lineWidth = 0.3f; に書き換え保存する。 (11) プログラムを実行し、スクリプトを書き換えても線の太さが変わらないことを確認 (12) Inspector でスクリプトの右上の ⠇メニューからResetを実行、数値がリセットされprefabも消えてしまったので再度 prefabを指定 (13) プログラムを実行し、スクリプトで書き換えた線の太さに書き換わっていることを確認 いかがでしょうか? >y軸方向のベクトルを定義してないのが問題なのかなと思ったのですが、関係ないですか? Y軸はX軸に対して必ず90度の角度になっていますのでその指定は意味がありません。
etcetera

2021/06/02 13:11

できました!とても丁寧な説明で分かりやすかったです!ありがとうございました!
guest

0

C#

1obj.transform.right = (endPos - startPos).normalized;

この行では、まず線の始点と終点の位置からその角度をベクトルとして求めています。
nomalize というのは正規化と言って、長さの要素を切り捨ててベクトルの方向のみを得る方法です。
ここでは、obj.transform.right の値を設定していますが、これはインスタンスとして生成されるオブジェクトのx軸方向となります。
Prefabとして Squareを指定した場合、横長に引き延ばされた正方形の傾きが始点から終点により求められます。
ちなみにこの行の1行前でobj.transform.position に設定するオブジェクトの位置は、(startPos + endPos) / 2 にすることで始点と終点のちょうど真ん中になるようにしているようです。
これは、prefabのオブジェクトのpivot が図形の真ん中になっていることを想定しているためです。

obj.transform.parent = this.transform;

この行では、作成されたインスタンスオブジェクトの親オブジェクトを指定しているだけのようです。
Hierachy 上でCreate Empty を実行して、親オブジェクトにする空のGameObjectを作成し、そこにスクリプトをアタッチさせるとよいでしょう。
実行中にHierachyを確認するとGameObjectの子として線を引くたびにprefabのコピーが増えていくのが解ると思います。

投稿2021/05/31 04:06

monmoko

総合スコア202

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

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

etcetera

2021/06/02 02:20

解答ありがとうございます!追加で質問なんですが、obj.transform.localScale = new Vector3((endPos - startPos).magnitude, lineWidth, 1); の部分で縦方向の長さをlineWidthで指定しても線の太さが変わりません。inspectorから直接いじると変わるのですが原因わかりますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問