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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

1回答

1635閲覧

[unity]ボタンを押しているあいだ一人称視点にしたい

torisva

総合スコア23

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2019/01/13 23:02

前提・実現したいこと

タイトルの通りボタンを押している間一人称視点(プレイヤーのモデルの目線)に
するスクリプトを作りたいと思っています。
以下が現在のスクリプトの内容です。
bool FPPは別の処理で使っているものです

public class PlayerController : MonoBehaviour { public bool FPP = false; float PushTime = 0; float Smooth = 5.0f; float TiltAngle = 70.0f; private void FirstPersonP() { GameObject FPPCam = GameObject.FindWithTag("FPPCamera"); GameObject Maincam = GameObject.FindWithTag("MainCamera"); Camera CamDepth = Maincam.GetComponent<Camera>(); float CDep = CamDepth.depth; if (Input.GetKey("k")) { if (CDep == -1) { CamDepth.depth = -3; } Rigidbody rb = GetComponent<Rigidbody>(); rb.isKinematic = true; float TiltAroundZ = Input.GetAxis("Horizontal") * TiltAngle; float TiltAroundX = Input.GetAxis("Vertical") * TiltAngle; Quaternion TrRot = transform.rotation; Quaternion FPPTrRot = FPPCam.transform.rotation; Quaternion Target = Quaternion.Euler(TiltAroundX, TiltAroundZ, 0); Target.z = 0; FPPCam.transform.rotation = Quaternion.Slerp(FPPTrRot, Target, Time.deltaTime * Smooth); } } private void Update() { GameObject FPPCam = GameObject.FindWithTag("FPPCamera"); GameObject Maincam = GameObject.FindWithTag("MainCamera"); Camera CamDepth = Maincam.GetComponent<Camera>(); float CDep = CamDepth.depth; if (Input.GetKey("k")) { PushTime += Time.deltaTime; if(PushTime >= 0.35) { FPP = true; FirstPersonP(); } } if (Input.GetKeyUp("k")) { CamDepth.depth = -1; PushTime = 0; FPP = false; FPPCam.transform.rotation = new Quaternion(0, 0, 0, 0); rb.isKinematic = false; } } }

playerの子オブジェクトとしてFPPCameraをつけています。
このスクリプトはplayerにアタッチされています。
MainCameraは別のオブジェクトです。(playerと親子関係はありません)

まずupdate内でkキーが長押しされているか判定します。
長押しされていない場合何も起きません。

長押しされた(PushTimeが0.35以上の)場合、
FirstPersonP()を処理します。

処理の最初にdepthをいじってカメラを切り替えます。

次にplayerのRigidbodyをkinematicにしplayerを動けなくします。

最後にkキーを離すまでカメラを操作します。
kキーが離された場合、いじった変数の中身をupdate内で元に戻しています。

発生している問題

このスクリプトだと+Z方向を見ている間は問題ないのですが
それ以外の方向を向いていても強制的に+Z方向にFPPCameraが向いてしまいます。
1,プレイヤーが向いている方向で一人称視点にしたい。
2,verticalとhorizontalの二つに入力があるとz軸がなぜか回ってしまう。

試したこと

Quaternion Target = Quaternion.Euler(TrRot.x + TiltAroundX,TrRot.y + TiltAroundZ, 0);

↑Targetの値にplayerの回転を足せばその方向を向いてくれるかなと思ったけど
何も変わりませんでした。

FPPTrRot.y += TrRot.y;

↑FPPCameraのy軸にplayerのy軸を足したらどうなるか試したら
なぜかカメラがガクガクするようになり、カメラがほとんど回らなくなりました。

そのほか

いつもはわからないところは検索して解決するのですが
今回はどこがどう悪いのか(特に試したことの二つ目)
どう検索すればいいのか分からなかったため質問させていただきました。

仕上がったスクリプトなどの完全な答えでなくて構いません。
(もちろん完全な答えであってもしっかり参考にさせていただきますし、とても助かります)

この単語を検索すると解決するかもとか
このスクリプトのどこが間違えていてこういう考え方をすればいいかもとか
そういうヒントでもとても助かります。

よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

質問頂きありがとうございます
とりあえず書いてみました
localRotationを使えば親に対する相対的な回転を指定できます。ただ、カメラのガクガクは多分プレーヤーを回転させるプログラムの方が原因だと思います。

ちょっと複雑な話ですがx軸回転した後にy軸回転するのとy軸回転をしたあとにx軸回転をするのでは向いている方向は一緒でも傾きが変わってしまいます。なのでfpsカメラにはquarternionの掛け算がおすすめです。

あと、Quarternionのxyzは(オイラー角)回転角ではなく4元数(回転行列みたいなもの)のxyzwの値なのでアクセスしないのが普通です。

C#

1public class PlayerController : MonoBehaviour { 2 public bool FPP = false; 3 Camera FPPCam; 4 Camera Maincam ; 5 Rigidbody rb; 6 float sensitivity=5;//感度 7 float angle=70; 8 void Awake(){ 9 FPPCam = GameObject.FindWithTag("FPPCamera").GetComponent<Camera>(); 10 Maincam = GameObject.FindWithTag("MainCamera").GetComoponent<Camera>(); 11 rb=GetComponent<Rigidbody>(); 12 } 13 Vector3 le;//euler angles for FPPcam 14 private void FirstPersonP() 15 { 16 FPPCam.enabled=true; 17 Maincam.enabled=false; 18 rb.isKinematic = true; 19 float ry = Input.GetAxis("Horizontal")*angle; 20 float rx = Input.GetAxis("Vertical")*angle; 21 le.x=Mathf.Lerp(le.x,rx,Time.deltaTime*sensitivity); 22 le.y=Mathf.Lerp(le.y,ry,Time.deltaTime*sensitivity); 23 24 FPPCam.localRotation=Quarternion.Euler(0,le.y,0)*Quarternion.Euler(le.x,0,0);//うまくいかなかったら順番を換えてください 25 } 26 private void Update(){ 27 if (Input.GetKey("k")) 28 { 29 PushTime += Time.deltaTime; 30 if(PushTime >= 0.35f) 31 { 32 FPP = true; 33 FirstPersonP(); 34 } 35 } 36 if (Input.GetKeyUp("k")) 37 { 38 FPPCam.enabled=false; 39 Maincam.enabled=true; 40 PushTime = 0; 41 FPP = false; 42 FPPCam.transform.localRotation = new Quaternion(0, 0, 0, 0); 43 rb.isKinematic = false; 44 } 45 } 46}

投稿2019/01/14 00:54

bochan2

総合スコア2050

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

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

torisva

2019/01/14 02:06

実際に動かしてみました、完璧です。 変数をまとめたり、if文を省略したりで ここまで文を短くしてくれたことも素晴らしいです。 localRotation…初めて知りましたありがとうございます! ただ一つFirstPersonP()のFPPCam.localRotationの部分にtransformを追加させていただきました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問