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

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

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

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

Unity

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

Q&A

解決済

1回答

1541閲覧

Unity3D 特定のキーを押している間、2つの指定した座標に滑らかに円形に行き来させたい

creatorsGame

総合スコア18

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2020/04/24 08:24

UnityでVector3.Slerpなどを使って特定のキーを押している間、2点の座標を滑らかに円形に行き来するようにしたいです。
なぜ、このような事をしたいのかというと、今FPSゲームを開発していて、下の画像のように腕オブジェクトを動かして歩くアニメーションの代わりにしたいと考えているからです。
ですが、キーを押している間に二つの座標を交互に行き来する方法が思いつきません。また、円形に動きません。
どう変更すればよいでしょうか?
イメージ説明

c#

1 public Vector3 walkPosition; 2 public Vector3 walkPosition2; 3 public float walkSpeed = 100f; 4 private void Update() 5 { 6 if(Input.GetKey(KeyCode.W)) 7 { 8 transform.localPosition = Vector3.Slerp(transform.localPosition, walkPosition, Time.deltaTime * walkSpeed); 9 transform.localPosition = Vector3.Slerp(transform.localPosition, walkPosition2, Time.deltaTime * walkSpeed); 10 } 11 }

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

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

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

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

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

guest

回答1

0

ベストアンサー

下記のような形はどうでしょうか?

C#

1 public Vector3 walkPosition; 2 public Vector3 walkPosition2; 3 public float walkSpeed = 100f; 4 5 private Vector3 controlPoint; 6 private float walkDistance; 7 8 private void Start() 9 { 10 // 2点の中点から真上に伸ばした位置にもう一つ点を置く 11 controlPoint = (walkPosition + walkPosition2) * 0.5f; 12 controlPoint.y += Vector3.Distance(walkPosition, walkPosition2); 13 } 14 15 private void Update() 16 { 17 if (Input.GetKey(KeyCode.W)) 18 { 19 // 0.0と1.0を往復する値を作り、それを使って3点の座標を混合し現在の位置とする 20 walkDistance += Time.deltaTime * walkSpeed; 21 var t = Mathf.PingPong(walkDistance, 1.0f); 22 transform.localPosition = EvaluatePosition(ModulateParameter(t)); 23 } 24 } 25 26 // 線形の変化を2次のS字カーブに変えてなめらかにする 27 private static float ModulateParameter(float t) 28 { 29 if (t < 0.5f) 30 { 31 t *= 2.0f; 32 t = t * t * 0.5f; 33 } 34 else 35 { 36 t = (1.0f - t) * 2.0f; 37 t = t * t * 0.5f; 38 t = 1.0f - t; 39 } 40 41 return t; 42 } 43 44 // 2次バーンスタイン多項式の形で3点を混合する 45 private Vector3 EvaluatePosition(float t) 46 { 47 var it = 1.0f - t; 48 var f0 = it * it; 49 var f1 = it * t * 2.0f; 50 var f2 = t * t; 51 return (walkPosition * f0) + (controlPoint * f1) + (walkPosition2 * f2); 52 }

厳密に言うと半円を描く動きではないですが、コントロールポイントの位置を変えることで軌道の形を調整しやすいんじゃないかと思ってあんな風にしてみました。
walkSpeedが1の時の動きは下図のような感じです。

図

投稿2020/04/26 11:46

Bongo

総合スコア10807

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

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

creatorsGame

2020/04/27 09:55 編集

出来ました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問