前提・実現したいこと
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
自己解決することができました。(方法はこのページの下の方にあります) しかし、
なぜ空のゲームオブジェクトを挟むと上手くいくのか説明をするとなると自信がありません。
試しにやってみたら動いたというのが正直なところです。
動く理由を説明していただけると大変ありがたいです。
回答1件
あなたの回答
tips
プレビュー