타입별 TPS 시점을 만드는 방법(in Unity3D with C#)
사전 쓰기
이번에 소개하는 의제는 다른 사이트나 다른 Qiita 유저 여러분도 소개되고 있는 「Unity3d로 TPS 시점 조작을 어떻게 구현하는가?」입니다. 이번에 소개하는 시점 조작은 다음과 같습니다.
참고: 정규 표현식이 깨끗한 코드가 아닙니다. 지적해 주시면 감사하겠습니다.
gif 내에서 카메라 조작이 굴곡 붙어있는 이유는 트랙볼 마우스를 사용하고 있기 때문입니다.
Unity3D에서 시점 조작 유형별 코드
슈팅 시스템
잘 TPS 슈팅 게임에 채용되고 있는 카메라 조작 방법입니다. PUBG나 Fortnight의 표준 조작은 이것이군요. 마우스를 Y축(상하) 방향으로 움직이면 카메라는 상하로 움직이고 X축으로 움직이면 캐릭터의 방향이 좌우로 움직입니다.
참고 이미지
MouseController.csusing 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 창에서 Character
및 Pivot
로 각 개체를 설정합니다.
위의 Gif에서는 unitychan 본체를 Character
로, 위에서 만든 Pivot를 pivot
로 설정했습니다. ↓
Pivot이 있는 것으로, 카메라가 상하로 이동해도, 확실히 캐릭터를 비추도록 되어 있습니다. TPS의 목적은 귀엽고 멋있는 캐릭터가 화면에 비치는 것도 장점 중 하나니까요. 많은 소개 사이트에서는 이것을 잊어 버립니다.
Min Y Angle
와 Max Y Angle
입니다만, 이것을 조정하는 것으로, 카메라의 상하 이동 범위를 넓힐 수 있습니다. 카메라 조작으로 더 위로 보이게 하고 싶다면, Max Y Angle
를 크게 설정하면 좋을 것입니다.
메탈기어・솔리드계
메탈 기어 솔리드 V를 참고로 한 카메라 조작 방법입니다. 스니킹 미션은 숨기는 것이 중요하고, 뒤에 적이 있는지 확인하고 싶을 때 등에 시점을 이동하면 몸의 방향이 바뀌고, 소리를 내거나 몸이 그늘에서 튀어 나오면 큰 문제입니다. 따라서 이 카메라 조작으로
는 마우스를 Y축(상하) 방향으로 움직이면 카메라는 상하로 움직이고 X축으로 움직이면 카메라가 캐릭터 주위를 돌립니다.
참고 이미지
MetalGearMouseController.csusing 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와 반대로 되어 있는데, 왜 올바르게 움직이는지 수수께끼입니다… 아시는 분은 꼭 가르쳐 주세요.
Reference
이 문제에 관하여(타입별 TPS 시점을 만드는 방법(in Unity3D with C#)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/K_phantom/items/d5d92955043137a59d8f
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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);
}
}
}
}
}
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);
}
}
Reference
이 문제에 관하여(타입별 TPS 시점을 만드는 방법(in Unity3D with C#)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/K_phantom/items/d5d92955043137a59d8f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)