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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

1回答

3238閲覧

TPSでのプレイヤーキャラクターの移動が上手くいきません

kosho206

総合スコア41

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2020/03/30 10:54

Unity初心者です。
キャラクターの移動はtransform.Translateを使うとできることを二週間ほど前に知りました。
また、キャラクターは移動させるだけではなく、回転(自転)もさせなければ自然な動きにならない事、それをするには「Quaternion」を使えば良いことを、つい昨日知りました。
そして今日、キャラクターをキーボードで動かすために以下のスクリプトを書きました。
イメージ説明
しかし、このスクリプトをアタッチしても思った通りには動きませんでした。
具体的には、
・z方向に移動しようとすると、キャラクターがx軸に回転してしまう
・x方向に移動しようとすると、y軸でその場でキャラクターがグルグル回ってしまう
という結果でした。

最初はif文の()内に「diff.magnitude」と書いたのですが、結果はあまり変わりませんでした。

そこで、僕は初心者ながらに
「y軸のベクトルの計算を無効にすれば良いのではないか」
と思いました。
y軸の移動までもが計算されQuaternionで処理されてしまうと、キャラクターがジャンプした時や落下した時に上方向または下方向に向いてしまうと思ったからです。

ですが、ググってもベクトル計算(Vector3)からy軸のみを無効化する方法は出てきませんでした。

以上の事を踏まえて、今回僕が知りたい事は次の二つです。

1.座標のベクトル計算からy軸のみを無効化する方法はないのでしょうか?

2.このスクリプトで僕がやりたいのはTPSの自キャラの移動処理です。
このスクリプトではそれができなかったのですが、上手くいかない原因は何でしょうか?

今日1日、自力で解決を試みましたがダメでした。
長文になってしまいましたが、回答よろしくお願いします。

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

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

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

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

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

Tto777

2020/03/31 12:46

コードは画像では無くコピペする様にして下さい。
Tto777

2020/03/31 13:15 編集

それと「2.このスクリプトで僕がやりたいのはTPSの自キャラの移動処理です。」の様な書き方をされてもどの様なTPSの移動か判りません。 作るだけならUnityにもう既にTPS移動があるのでそのコードを参考にするなり使うなりすれば良いのではないでしょうか?
Tto777

2020/03/31 13:16 編集

正直なところUnity初心者特有の既にあるものを何ら参考にせずに自分で作ろうとするのは何故なのかから教えて欲しいです。
guest

回答1

0

ベストアンサー

こんばんは
想定している回転具合が判らないのですがHorizontalを使った単純な回転はtransform.Rotate(0, x, 0);だけで良いかと思います。

C#

1 void Update() 2 { 3 float x; 4 float z; 5 Vector3 translation = Vector3.zero; 6 float runVelocity = 7.0f; 7 8 x = Input.GetAxis("Horizontal"); 9 z = Input.GetAxis("Vertical"); 10 11 translation.x = x * runVelocity * Time.deltaTime; 12 translation.z = z * runVelocity * Time.deltaTime; 13 14 transform.Translate(translation); 15 transform.Rotate(0, x, 0); 16 }

Update内をこれに差し替えて想定する動きかになるかどうか教えて下さい。


・追記1:コメント内容を受けての新しいコード
ThirdPersonCharacterのカメラを子にしていない時と同じような動きは下記コードで近付けると思います。

・変更点
transform.Translate(translation);transform.position += translation;に変更。
滑らかな回転にする為Quaternion.Slerpを追加。

C#

1 void Update() 2 { 3 float x; 4 float z; 5 Vector3 translation = Vector3.zero; 6 float runVelocity = 7.0f; 7 8 z = Input.GetAxis("Vertical"); 9 x = Input.GetAxis("Horizontal"); 10 11 translation.x = x * runVelocity * Time.deltaTime; 12 translation.z = z * runVelocity * Time.deltaTime; 13 14 transform.position += translation; 15 16 Vector3 diff = transform.position - UnkomanPos; 17 Vector3 stop = Vector3.zero; 18 19 if (x != 0) 20 { 21 Quaternion look = Quaternion.LookRotation(diff,Vector3.up); 22 transform.rotation = Quaternion.Slerp(transform.rotation, look, 0.2f); 23 } 24 25 UnkomanPos = transform.position; 26 }

・ThirdPersonCharacterとの相違点
・アニメーション制御していないのでもちろん移動アニメをしない
・キャラクターの子にカメラを入れても追跡の挙動にならないのでおかしくなる(カメラはキャラの子にしないで下さい)
・Uターンした時の減衰が無い

ThirdPersonCharacterと全く同じ挙動にするのであればここからの道のりは結構あるので元のコード参照した方が良いです。

投稿2020/03/30 15:32

編集2020/03/31 14:32
Hawn

総合スコア1222

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

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

kosho206

2020/03/31 04:15

回答ありがとうございます 回答いただいたとおりにしてみました。 確かに、しっかり動きました。 ですが僕がやりたかった挙動とは少し違いました。 具体的に言うと、X方向の入力をすると、キャラクターの向きが変わるだけでなく、その場で回転してしまうんですね 僕はこのスクリプトで人型のキャラクターを動かしたかったので、x入力をしたら回転を続けるのではなく、1度クルッと移動方向に向きを変えて、そのまま真っ直ぐ歩いて欲しかったです。 キャラクターの向きを変えるスクリプトはQuaternion.LookRotationでできると僕は思っているのですが、これを使って、正面方向の引数をフレーム毎のベクトル差分にしても、なかなか上手く動きません。 この質問に書いたスクリプトでどこか間違っているところがあるのでしょうか
Hawn

2020/03/31 12:17 編集

>X方向の入力をすると、キャラクターの向きが変わるだけでなく、その場で回転してしまうんですね 普通のGameObjectで試しているならば向きが変わると回転は同一かと思います。 何かしらのキャラクターアニメーションを併用しているならばその事を質問文に書いておいて下さい。 >x入力をしたら回転を続けるのではなく、1度クルッと移動方向に向きを変えて、そのまま真っ直ぐ歩いて欲しかったです。 x入力(A,D,←,→)のキーを押すとその方向に90度回転してキーを押していればその方向にそのまま進み続ける。という認識で良いのでしょうか? この場合 ・瞬時回転(0度→90度)なのか補間回転(回転中も滑らかに表示する)なのか考える必要があります。 ・補間の場合はQuaternion.LookRotationだけでは駄目なのでQuaternion.Slerpを使う必要とその動き中にキー入力が発生した場合どう処理するのかも考える必要があります。 始めたばかりの頃は難しいかと思いますがこれら実装項目の言語化を心がけて下さい。
Hawn

2020/03/31 12:29 編集

>僕がやりたいのはTPSの自キャラの移動処理 と書かれているにも関わらずx入力が回転だけでは駄目というのが何をやりたいのか不明です。 UnityのStandard Assetsに含まれるThirdPersonCharacterでは駄目な理由や使わない理由も書いて頂けると判り易いです。 文章に出来ないのであれば参考になるゲーム動画など追記すれば想定している動きを万人が判ると思います。
kosho206

2020/03/31 13:18

丁寧に回答いただきありがとうございます。 「キャラクターの向きが変わる」と「キャラクターが回転する」というのは確かに同じですね。ごめんなさい。 後に回答者様が仰った通り、x入力をしたら90度回転してそのまま進み続ける、ということが言いたかったです。 また、「想定している動き」というのは、ちょうどスタンダードアセットのThirdPersonControllerとほぼ同じ動きです。 にも関わらず自分でスクリプトを書いて動かそうとしている理由は、スクリプトについて理解したいからです。 スクリプトを理解して、後に自分で考えた思い通りの動きを自由に使えるようになりたいからです。 追記で教えていただいた通り、z方向とy方向の移動を回転に反映させないように、if文()内をxのみに限定させてみます。 スクリプトを理解するために自分でコードを書きゲームを完成させようとしていました。 ですが完全に理解するまでには時間がかかり、モチベーションが無くなりそうなのでしばらくの間はスタンダードアセットのスクリプトを使い、本命のゲーム制作を進めながら少しづつ理解していこうと思います。 ありがとうございました
Hawn

2020/03/31 14:40 編集

カメラをキャラクターの子にせずに俯瞰視点で動かした時の動きという事を完全に理解しました。 私もThirdPersonControllerを想定はしていましたが、 アレはカメラの親子関係で挙動が違うので追跡視点の動きを想定していました。 ・カメラをキャラの子にしない俯瞰視点:Aキーを押すと左方向を向いて左に走り続ける。 ・カメラをキャラの子にした追跡視点:Aキーを押すと左回転だけを行う。 俯瞰視点の動きであれば追記に書いておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問