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

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

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

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

Unity

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

Q&A

解決済

1回答

2655閲覧

Unityにてカメラの正面方向を基準にオブジェクトを移動させたい

ikura

総合スコア7

C#

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

Unity

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

0グッド

0クリップ

投稿2018/02/14 15:13

前提・実現したいこと

unityにてカメラの正面方向を基準にオブジェクトを移動させようと考えています。
オブジェクトの向きを移動方向に向ける機能をつけようとしていた所、エラーが発生致しました。
自力では解決できそうに無いため、お力添えを頂きたく存じます。

発生している問題・エラーメッセージ

オブジェクトをワールド座標のZ軸マイナス方向に移動させようとすると、挙動がおかしくなり、最終的にオブジェクトが見えなくなってしまいます。
その際に表示されるエラーメッセージは以下の通りです。

creen position out of view frustum (screen pos 0.000000, 0.000000, 1000.000000) (Camera rect 0 0 956 527)

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Player : MonoBehaviour { 6 7 public float moveSpeed = 5f; //移動速度 8 public float moveForceMultiplier; //移動速度の入力に対する感度 9 public new GameObject gameObject;          //カメラのオブジェクト 10 11 private float moveX; 12 private float moveZ; 13 private Vector3 gameForward; 14 private Vector3 moveForward; 15 private Vector3 moveVector; 16 private Quaternion rotation; 17 18 private Rigidbody rb; 19 private Animator animator; 20 21 // Use this for initialization 22 void Start () { 23 rb = GetComponent<Rigidbody>(); 24 animator = GetComponentInChildren<Animator>(); 25 } 26 27 //Update is called once per frame 28 void Update () { 29 moveX = Input.GetAxis("Horizontal"); 30 moveZ = Input.GetAxis("Vertical"); 31 32 //キャラクターの向きを進行方向に向ける 33 if (moveForward != Vector3.zero) 34 transform.rotation = Quaternion.LookRotation(moveForward); 35 36 //アニメーション 37 animator.SetFloat("Speed", rb.velocity.magnitude); 38 } 39 40 private void FixedUpdate() 41 { 42 //カメラの方向から、X-Z平面の単位ベクトルを取得 43 gameForward = Vector3.Scale(gameObject.transform.forward, new Vector3(1, 0, 1)).normalized; 44 //wasdキーの入力値とカメラの向きから、移動方向を決定 45 moveForward = gameForward * moveZ + gameObject.transform.right * moveX; 46 //入力された移動速度 47 moveVector = moveForward * moveSpeed; 48 49 //入力された速度-現在の速度*感度=力 50 rb.AddRelativeForce(moveForceMultiplier * (moveVector - rb.velocity)); 51 } 52} 53

試したこと

「//キャラクターの向きを進行方向に向ける」の下2行をコメントアウトした所、エラーが発生しなくなったので、間違いなくこの部分でエラーが起きていることは分かるのですが、その解決方法が分かりません。

補足情報(FW/ツールのバージョンなど)

unityのバージョンは2017.3.of3 Personal(64bit)と書かれています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

キャラクターに力を加える際にAddRelativeForceを使っているのは何か理由があるのでしょうか?
もしここを変えても構わないなら、メソッドをAddForceに置き換えて

C#

1 //入力された速度-現在の速度*感度=力 2 rb.AddForce(moveForceMultiplier * (moveVector - rb.velocity));

としてみるとどうでしょう。

見た感じですと、キャラクターに加える力はワールド座標系前提で算出しているご様子です。これに対し、AddRelativeForceは加える力をキャラクターのローカル座標系で指定するべきものかと思います。
キャラクターが無回転だと、キャラクター座標系とワールド座標系の向きが一致するため意図通り運動しますが、キャラクターが回転すると力の向きが狂ってしまい、おかしな動きになるのではないでしょうか。

投稿2018/02/14 22:04

Bongo

総合スコア10807

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

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

ikura

2018/02/14 23:40

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問