타입별 TPS 시점을 만드는 방법(in Unity3D with C#)

14430 단어 Unity3DC#Unity

사전 쓰기



이번에 소개하는 의제는 다른 사이트나 다른 Qiita 유저 여러분도 소개되고 있는 「Unity3d로 TPS 시점 조작을 어떻게 구현하는가?」입니다. 이번에 소개하는 시점 조작은 다음과 같습니다.
  • 슈팅 시스템
  • 메탈 기어 솔리드 시스템

  • 참고: 정규 표현식이 깨끗한 코드가 아닙니다. 지적해 주시면 감사하겠습니다.
    gif 내에서 카메라 조작이 굴곡 붙어있는 이유는 트랙볼 마우스를 사용하고 있기 때문입니다.

    Unity3D에서 시점 조작 유형별 코드



    슈팅 시스템



    잘 TPS 슈팅 게임에 채용되고 있는 카메라 조작 방법입니다. PUBG나 Fortnight의 표준 조작은 이것이군요. 마우스를 Y축(상하) 방향으로 움직이면 카메라는 상하로 움직이고 X축으로 움직이면 캐릭터의 방향이 좌우로 움직입니다.

    참고 이미지


    MouseController.cs
    using UnityEngine;
    
    public class MouseController : MonoBehaviour
    {
        [SerializeField]
        private Transform character;    //キャラクターをInspectorウィンドウから選択してください
        [SerializeField]
        private Transform pivot;    //キャラクターの中心にある空のオブジェクトを選択してください
    
        void Start()
        {
            //エラーが起きないようにNullだった場合、それぞれ設定
            if(character == null)
                character = transform.parent;
            if(pivot == null)
                pivot = transform;
        }
        //カメラ上下移動の最大、最小角度です。Inspectorウィンドウから設定してください
        [Range(-0.999f, -0.5f)]
        public float maxYAngle = -0.5f;
        [Range(0.5f, 0.999f)]
        public float minYAngle  = 0.5f;
        // Update is called once per frame
        void Update()
        {
            //マウスのX,Y軸がどれほど移動したかを取得します
            float X_Rotation = Input.GetAxis("Mouse X");
            float Y_Rotation = Input.GetAxis("Mouse Y");
            //Y軸を更新します(キャラクターを回転)取得したX軸の変更をキャラクターのY軸に反映します
            character.transform.Rotate(0, X_Rotation, 0);
    
            //次はY軸の設定です。
            float nowAngle = pivot.transform.localRotation.x;
            //最大値、または最小値を超えた場合、カメラをそれ以上動かない用にしています。
            //キャラクターの中身が見えたり、カメラが一回転しないようにするのを防ぎます。
            if (-Y_Rotation != 0)
            {
                if (0 < Y_Rotation)
                {
                    if (minYAngle <= nowAngle)
                    {
                        pivot.transform.Rotate(-Y_Rotation, 0, 0);
                    }
                }
                else
                {
                    if (nowAngle <= maxYAngle)
                    {
                        pivot.transform.Rotate(-Y_Rotation, 0, 0);
                    }
                }
            }
        }
    }
    

    위의 스크립트를 움직이려는 카메라에 연결하고 unitychan의 몸통의 중심 부분에 빈 객체를 만들고 (Pivot이라고 함) 카메라를 자식 요소로 만듭니다. ↓


    그런 다음 Inspector 창에서 CharacterPivot로 각 개체를 설정합니다.
    위의 Gif에서는 unitychan 본체를 Character로, 위에서 만든 Pivot를 pivot로 설정했습니다. ↓


    Pivot이 있는 것으로, 카메라가 상하로 이동해도, 확실히 캐릭터를 비추도록 되어 있습니다. TPS의 목적은 귀엽고 멋있는 캐릭터가 화면에 비치는 것도 장점 중 하나니까요. 많은 소개 사이트에서는 이것을 잊어 버립니다.
    Min Y AngleMax Y Angle 입니다만, 이것을 조정하는 것으로, 카메라의 상하 이동 범위를 넓힐 수 있습니다. 카메라 조작으로 더 위로 보이게 하고 싶다면, Max Y Angle를 크게 설정하면 좋을 것입니다.

    메탈기어・솔리드계



    메탈 기어 솔리드 V를 참고로 한 카메라 조작 방법입니다. 스니킹 미션은 숨기는 것이 중요하고, 뒤에 적이 있는지 확인하고 싶을 때 등에 시점을 이동하면 몸의 방향이 바뀌고, 소리를 내거나 몸이 그늘에서 튀어 나오면 큰 문제입니다. 따라서 이 카메라 조작으로
    는 마우스를 Y축(상하) 방향으로 움직이면 카메라는 상하로 움직이고 X축으로 움직이면 카메라가 캐릭터 주위를 돌립니다.

    참고 이미지


    MetalGearMouseController.cs
    using UnityEngine;
    
    public class MetalGearMouseController : MonoBehaviour
    {
    
        [SerializeField]
        private Transform pivot = null;
        void Start()
        {
            if (pivot == null)
                pivot = transform.parent;
        }
    
        [Range(-0.999f, -0.5f)]
        public float minYAngle = -0.5f;
        [Range(0.5f, 0.999f)]
        public float maxYAngle = 0.5f;
        void Update()
        {
            //マウスのX,Y軸がどれほど移動したかを取得します
            float X_Rotation = Input.GetAxis("Mouse X");
            float Y_Rotation = Input.GetAxis("Mouse Y");
            //Y軸を更新します(キャラクターを回転)取得したX軸の変更をキャラクターのY軸に反映します
            pivot.transform.Rotate(0, X_Rotation, 0);
    
            //次はY軸の設定です。
            float nowAngle = pivot.transform.localRotation.x;
            //最大値、または最小値を超えた場合、カメラをそれ以上動かない用にしています。
            //カメラが一回転しないようにするのを防ぎます。
            if (-Y_Rotation != 0)
            {
                if (0 < Y_Rotation)
                {
                    if (minYAngle <= nowAngle)
                    {
                        pivot.transform.Rotate(Y_Rotation, 0, 0);
                    }
                }
                else
                {
                    if (nowAngle <= maxYAngle)
                    {
                        pivot.transform.Rotate(Y_Rotation, 0, 0);
                    }
                }
            }
            //操作していると、Z軸がだんだん動いていくので、0に設定してください。
            pivot.eulerAngles = new Vector3(pivot.eulerAngles.x, pivot.eulerAngles.y, 0f);
        }
    }
    

    Inspector 창에서 설정하는 방법은 위의 슈팅 코드와 거의 같습니다. 하지만 이번에는 Character 를 회전시킬 필요가 없기 때문에 Pivot 뿐입니다.

    끝에



    Qiita의 MD는 언더라인 할 수 없네요… 또, 마우스 X, Y가 Transform의 X, y와 반대로 되어 있는데, 왜 올바르게 움직이는지 수수께끼입니다… 아시는 분은 꼭 가르쳐 주세요.

    좋은 웹페이지 즐겨찾기