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

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

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

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

Unity3D

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

Q&A

解決済

1回答

943閲覧

レティクルと銃の向く先をぶれないようにしたい

tfunity

総合スコア2

C#

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

Unity3D

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

0グッド

0クリップ

投稿2021/03/05 12:39

編集2021/03/08 08:15

前提・実現したいこと

FPSでどの方向を向いても銃の向く先とレティクルがほぼ一致するようにしたいです。
(親オブジェクト)>(子オブジェクト)というように表記します。

プレイヤー(円柱)>カメラ>銃

となっております。
視点の移動はy軸回転はプレイヤーが、
x軸回転はカメラがします。
(軸はプレイヤー、カメラのローカルの軸です)

発生している問題

上を見たり下を見たりすると銃のほうが若干速く回転してしまい、
レティクルと銃口の向きがかなりずれます。

該当のソースコード

C#(カメラにアタッチしてあります)

1 2using UnityEngine; 3using System.Collections; 4 5public class playercontroller : MonoBehaviour { 6 7 public float mousesensitivity = 100f; 8 public Transform playerbody; 9 public CharacterController player; 10 float xRotation = 0f; 11 public float speed = 10f; 12 Vector3 velocity; 13 public float gravity = -9.8f; 14 15 public Transform groundhanteit; 16 public float hankei = 0.4f; 17 public LayerMask ground; 18 public float jumpheight; 19 20 21 bool isgrounded; 22 23 // Use this for initialization 24 void Start () { 25 26 Cursor.lockState = CursorLockMode.Locked; 27 28 } 29 30 // Update is called once per frame 31 void Update () { 32 33 isgrounded = Physics.CheckSphere(groundhanteit.position,hankei,ground); 34 35 float mousex = Input.GetAxis("Mouse X") * mousesensitivity * Time.deltaTime; 36 float mousey = Input.GetAxis("Mouse Y") * mousesensitivity * Time.deltaTime; 37 38 float x = Input.GetAxisRaw("Horizontal") * speed * Time.deltaTime; 39 float z = Input.GetAxisRaw("Vertical") * speed * Time.deltaTime; 40 41 Vector3 move = transform.right * x + transform.forward * z; 42 43 player.Move(move); 44 45 velocity.y += gravity * Time.deltaTime; 46 if (isgrounded && velocity.y < 0) 47 { 48 velocity.y = -2f; 49 } 50 51 if (Input.GetButtonDown("Jump") && isgrounded) 52 { 53 velocity.y = Mathf.Sqrt(jumpheight * -2f * gravity); 54 } 55 56 player.Move(velocity*Time.deltaTime); 57 58 59 xRotation -= mousey; 60 xRotation = Mathf.Clamp(xRotation, -90f, 90f); 61 62 transform.localRotation = Quaternion.Euler(xRotation,0f,0f); 63 playerbody.Rotate(Vector3.up * mousex); 64 65 66 67 68 } 69} 70 71

試したこと

銃にスクリプトをアタッチし、
カメラのローカル角度を取得して
x軸回転の部分に1未満の少数をかけて銃のローカル角度に代入しなおしてみましたがやはり駄目でした。
(親子関係のままと、親子関係を解除してからも一応試してみましたが当然駄目でした)

オブジェクトを置く位置を調整してみましたが、どうも視点移動と銃の回転がぴったり合うように見えません。

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

version 5.3.8p2

自己解決することができました。(方法はこのページの下の方にあります) しかし、

なぜ空のゲームオブジェクトを挟むと上手くいくのか説明をするとなると自信がありません。
試しにやってみたら動いたというのが正直なところです。
動く理由を説明していただけると大変ありがたいです。

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

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

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

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

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

K_3578

2021/03/08 07:27

@質問者さん 自己解決とのことですが、質問の本筋と若干脱線した内容になりますし、質問を編集した方が回答を得られやすいと思います。あくまで追記の形にした上で元の質問は内容残した方が良いですが。
tfunity

2021/03/08 08:22

@K_3578さん 質問を編集いたしました。 アドバイスしていただき、ありがとうございます
K_3578

2021/03/08 08:23

@質問者さん 私はゲーム開発は専門外なので質問に関してはお役に立てなくて申し訳ない。 解決されることをお祈りします。
K_3578

2021/03/17 02:20

回答得られないようだったら本質問は自己解決でクローズにして新たな質問を挙げても良いかもしれませんね。
tfunity

2021/03/17 04:30

そうですね。この質問は閉じさせていただきます。
guest

回答1

0

自己解決

自己解決しました

親オブジェクト>子オブジェクトと表記します
Create Emptyによって出来たオブジェクトをAと表記します

A>プレイヤー(円柱)、カメラ>銃

↑上記のように設定し、

カメラには
マウスによる視点移動のスクリプト(x軸回転はカメラの角度、y軸回転はAの角度をそれぞれプログラムから操作しています)

Aには
wasdキーによる移動のスクリプト

をそれぞれアタッチしましたところ、目的の動きが実現しました。

しかし、なぜAを挟むと上手くいくか説明できるかというと自信がありません。
やってみたら動いたというのが正直なところです。
どなたか理由を教えていただけると幸いです。

投稿2021/03/08 07:15

tfunity

総合スコア2

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問