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

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

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

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

Unity3D

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

Q&A

解決済

1回答

13392閲覧

マウスの位置に向かって伸縮するオブジェクトを実装したいのですが、伸縮で躓きました

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Unity3D

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

1グッド

3クリップ

投稿2016/05/16 13:54

編集2016/05/17 14:53

###実装したい機能
マウスの位置に向かって伸縮するオブジェクト
他にも処理速度などに関するアドバイスがあればよろしくお願いします

###実装した物
x座標とz座標のみで描画しカメラはy軸上で固定の擬似的な2D
回転軸に空のゲームオブジェクトを用意、回転させたい物の親にする
クリックした地点にオブジェクトが親ごと移動
Vector3.Distanceを使用し、オブジェクトが生成された地点とマウスの位置の距離distを出す
オブジェクトの元のサイズにdistを半分にした物を足した分だけ伸びる
その際オブジェクトをdistの半分移動させる *
マウスの位置からオブジェクトの位置を元に角度を算出
親をそれに合わせて回転させる

###問題点
・最初にマウスを上下以外に向かって伸ばす
・伸ばしたオブジェクトを縮める
上記の二つの行動をした際にオブジェクトの位置と軸がずれる
また、最初に下へ伸ばした場合、マウスの逆方向へ伸びるようになる
*が原因ではないかと思っていますがどう修正すべきかがわかりません

###コード

public GameObject bar;//オブジェクト public GameObject pivot;//回転軸、barの親、空のゲームオブジェクト private Vector3 mousePos; private Vector3 barPos; private Vector3 objDirection;//マウスとオブジェクトの角度 private Vector3 newSca;//伸縮時の新しいサイズ private Vector3 newPos;//伸縮時に移動する private float dist; //オブジェクトとマウスの距離 void OnMouseDown() { bar.transform.localScale = new Vector3 (0.25f, 0.25f, 0.25f); newSca = bar.transform.localScale; if (!bar.activeInHierarchy) { bar.gameObject.SetActive (true); } barPos = Camera.main.ScreenToWorldPoint (new Vector3 (Input.mousePosition.x, Input.mousePosition.y, 9.5f)); pivot.transform.position = barPos; } void OnMouseDrag() { mousePos = Camera.main.ScreenToWorldPoint (new Vector3 (Input.mousePosition.x, Input.mousePosition.y, 9.5f)); dist = Vector3.Distance (barPos, mousePos); newSca.y = 0.25f + dist/2; newPos = new Vector3 (barPos.x, barPos.y, barPos.z + dist/2); objDirection = mousePos - bar.transform.position; pivot.transform.LookAt(bar.transform.position + new Vector3(objDirection.x, 90, objDirection.z)); if (dist < 1.25f) { bar.transform.position = (newPos); bar.transform.localScale = newSca; } }
salaam👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

マウスの位置に向かって伸縮するオブジェクト

上記の実装のみを組み込むのでしたら、下記のコードで実装できると思います。
イメージ説明

C#

1private Vector3 m_mouseDownPosition = Vector3.zero; 2 3void OnMouseDown() 4{ 5 // マウスクリックした際の初期位置を保存。 6 m_mouseDownPosition = transform.position; 7} 8 9void OnMouseDrag() 10{ 11 // マウスクリックした場所をワールド座標に変化して、 12 // 初期位置とマウスクリック位置の中間にオブジェクトを配置。 13 // オブジェクトのスケールを初期位置とマウスクリックの距離に。 14 // オブジェクトの向きをマウスクリックした位置に。 15 16 Vector3 inputPosition = new Vector3( Input.mousePosition.x, Input.mousePosition.y, 9.5f ); 17 Vector3 mousePos = Camera.main.ScreenToWorldPoint( inputPosition ); 18 Vector3 mediumPos = ( mousePos - m_mouseDownPosition ) / 2.0f; 19 float dist = Vector3.Distance( mousePos, m_mouseDownPosition ); 20 21 transform.position = mediumPos; 22 transform.localScale = new Vector3( 1.0f, 1.0f, dist ); 23 transform.LookAt( mousePos ); 24} 25 26void OnMouseUp() 27{ 28 // 位置、回転、スケールを元に戻す。 29 transform.position = m_mouseDownPosition; 30 transform.rotation = Quaternion.identity; 31 transform.localScale = Vector3.one; 32}

イメージ説明

投稿2016/05/18 00:09

urahimono

総合スコア714

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

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

退会済みユーザー

退会済みユーザー

2016/05/18 01:08

ありがとうございます! 今日の午後に試してみようと思います
退会済みユーザー

退会済みユーザー

2016/05/18 15:38

オブジェクト自体にではなく、フィールドにスクリプトを入れているためか、サンプルと同じように作成しようとすると失敗しました。 オブジェクトを(マウスの位置ークリックした位置/2の位置)に移動させるとなぜか画面の中心へ移動してしまい、軸はクリックした位置のままなのでマウスを動かすとおかしな動きをしてしまいます。 あとオブジェクト自体にスクリプトを入れていないためか、計算に使う変数は両方ともワールド座標に変換していないとあらぬ方向へワープしてしまいます。
urahimono

2016/05/19 12:53

あくまで、軸となる空のゲームオブジェクトの子に表示したいオブジェクトを持つ必要があるのですね。 スクリプトは軸となる空のゲームオブジェクトのほうにつけてあるのでしょうか?
退会済みユーザー

退会済みユーザー

2016/05/19 13:22

いえ、スクリプトは伸縮と回転させたいオブジェクトでもその軸になる空のゲームオブジェクトでもなく ゲームのフィールドとなるオブジェクトにつけています
退会済みユーザー

退会済みユーザー

2016/05/20 19:39

オブジェクトではなくフィールドにスクリプトを入れているせいで、( mousePos - m_mouseDownPosition ) / 2.0f;の計算をした時にフィールドの中央に移動してしまうみたいですね
退会済みユーザー

退会済みユーザー

2016/05/20 20:34 編集

Vector3(( mousePos.x - m_mouseDownPosition.x ) / 2.0f + m_mouseDownPosition.x,... というように書き直したらなんとか理想の動きになりました ヒントを出していただきありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問