1. 캐릭터 이동
1)
솔져 캐릭터를 만들것이기 때문에 하이라키창에 솔져라는 이름의 빈 오브젝트를 생성하고
받아온 Y bot 아바타를 자식 오브젝트로 넣어줍니다.
2)
부모 오브젝트인 솔져의 컴포넌트에
리지드바디와 캡슐콜라이더를 추가해줬습니다.
리지드바디는 물리효과를 주기 위함과 동시에 이동구현 코드에 필요합니다.
캡슐 콜라이더는 충돌효과를 위해 필요합니다.
3)
UnitController라는 유닛의 기능을 담당할 스크립트를 새로 만들었습니다.
여기서 캐릭터의 이동과 카메라의 회전 등을 담당할 것입니다.
카메라를 담당하는 스크립트를 따로 만들어도되지만 유닛전용 카메라이기 때문이기도 하고 카메라 시점에따라 유닛이 바라보는 방향이 달라져야 하기때문에 그냥 하나의 스크립트에 작성했습니다.
[UnitController.cs]
public class UnitController : MonoBehaviour
{
private Rigidbody rigidUnit;
public float walkSpeed;
void Start()
{
rigidUnit = GetComponent<Rigidbody>();
}
void Update()
{
Move();
}
void Move()
{
// 키보드 a,d 키를 누른 경우(x값).
float moveDirX = Input.GetAxisRaw("Horizontal");
// 키보드 w,s 키를 누른 경우(z값).
float moveDirZ = Input.GetAxisRaw("Vertical");
// x축(좌우)이동에 대한 이동값.
Vector3 _moveHorizontal = transform.right * moveDirX;
// z축(앞뒤)이동에 대한 이동값.
Vector3 _moveVertical = transform.forward * moveDirZ;
// 앞,뒤,좌,우 이동 및 대각선 이동값까지 고려하여 normalized 사용.
// 이동속도는 walkSpeed로 조절.
Vector3 _velocity = (_moveHorizontal + _moveVertical).normalized * walkSpeed;
// 리지드바디의 MovePosition매서드를 사용.
// 해당 오브젝트의 포지션값에 만들어놓은 이동값 추가.
// Time.deltaTime을 사용하여 매프레임마다가 아닌 시간에 따라 이동구현.
rigidUnit.MovePosition(transform.position + _velocity * Time.deltaTime);
}
}
2. 캐릭터에 카메라 고정시키기
유닛 전용 카메라를 만들어주기 위해 카메라를 솔져의 자식 오브젝트로 넣어줍니다.
카메라의 포지션과 로테이션을 조정하여 원하는 위치에 카메라를 지정해줍니다.
오버워치는 FPS이기때문에 카메라를 캐릭터의 손과 총이 보이는 위치에 지정해줬습니다.
3. 마우스포인터 캐릭터 카메라에 고정시키기
게임을 할 때 마우스포인터 따로 조준선 따로 나타나면 안되기 때문에
게임실행 시 마우스 포인터를 숨기고 게임창 센터에 고정시켜줍니다.
[UnitController.cs]
public class UnitController : MonoBehaviour
{
private Rigidbody rigidUnit;
public float walkSpeed;
void Awake()
{
// 마우스 커서를 게임화면에 고정.
Cursor.lockState = CursorLockMode.Locked;
// 마우스 보이게 할거냐? No!
Cursor.visible = false;
}
void Start()
{
rigidUnit = GetComponent<Rigidbody>();
}
void Update()
{
Move();
}
void Move()
{
float moveDirX = Input.GetAxisRaw("Horizontal");
float moveDirZ = Input.GetAxisRaw("Vertical");
Vector3 _moveHorizontal = transform.right * moveDirX;
Vector3 _moveVertical = transform.forward * moveDirZ;
Vector3 _velocity = (_moveHorizontal + _moveVertical).normalized * walkSpeed;
rigidUnit.MovePosition(transform.position + _velocity * Time.deltaTime);
}
}
4. 마우스에 따른 캐릭터 회전 및 카메라 회전
솔져의 자식오브젝트로 넣어놓은 카메라를 사용.
마우스를 상하좌우로 움직이면 카메라의 시점이 따라가게 설정.
[UnitController.cs]
public class UnitController : MonoBehaviour
{
[SerializeField]
private Camera myCamera;
private Rigidbody rigidUnit;
public float walkSpeed;
[SerializeField]
private float mouseSensitive;
[SerializeField]
private float cameraRotLimit;
private float currCameraRotX;
void Update()
{
Move();
UnitRotation();
CameraRotation();
}
// 마우스 좌우 이동->유닛 좌우 회전(카메라도 같이 회전됨) 자식이니까.
void UnitRotation()
{
float yRot = Input.GetAxisRaw("Mouse X");
Vector3 unitRotY = new Vector3(0, yRot, 0) * mouseSensitive;
// Quaternion.Euler
// :z축을 중심으로 z도, x축을 중심으로 x도, y축을 중심으로 y도 회전하는 회전을 반환.
rigidUnit.MoveRotation(rigidUnit.rotation * Quaternion.Euler(unitRotY));
}
// 마우스 상하 이동->유닛회전X, 카메라와 무기&팔만 같이 회전.
// 무기&팔 회전은 아직 구현X.
void CameraRotation()
{
float xRot = Input.GetAxisRaw("Mouse Y");
float cameraRotX = xRot * mouseSensitive;
currCameraRotX -= cameraRotX;
// Mathf.Clamp
// :카메라의 각도제한. 마우스를 상하로 360도 회전하면 안되기 때문.
currCameraRotX = Mathf.Clamp(currCameraRotX, -cameraRotLimit, cameraRotLimit);
myCamera.transform.localEulerAngles = new Vector3(currCameraRotX, 0, 0);
}
}
회전값에 대해 공부하면서 알게된 점.
1)
마우스 좌우이동에 대한 "Mouse X"로 캐릭터의 좌우회전을 조정하고 싶을 때 캐릭터의 로테이션 y를 조정해야함.
캐릭터 중심에 함수처럼 가로로 x축, 세로로 y축이 있는 것.
그러니 캐릭터는 y축을 기준으로 좌우로 회전할 수 있음.
2)
마우스 상하이동에 대한 "Mouse Y"로 카메라의 상하회전을 조정하고 싶을 때 위 코드처럼
'-='를 해줘야 정상적으로 같이 회전함.
'+='을 해주면 마우스는 위로 올리는데 카메라는 반대로 아래로 내려감.
<참고한 영상>
https://www.youtube.com/watch?v=GvtZDGN_kbQ
'Unity > Unity FPS게임 프로젝트(오버워치라이크)' 카테고리의 다른 글
[Unity 게임프로젝트] FPS게임<오버워치>(5-2) - 캐릭터 스킬 기능 활성화(미완성) (0) | 2024.05.27 |
---|---|
[Untiy 게임프로젝트] FPS 게임<오버워치>(5) - 캐릭터 스킬 기능 (0) | 2024.05.23 |
[Unity 게임프로젝트] FPS 게임<오버워치>(4) - 적 봇 생성, 총 슈팅 기능, 재장전 모드 구현 (0) | 2024.05.22 |
[Unity 게임프로젝트] FPS 게임<오버워치>(3) - 캐릭터 점프, 앉기 기능 구현 (0) | 2024.05.15 |
[Unity 게임프로젝트] FPS 게임<오버워치>(1) - 프로젝트 세팅, 캐릭터 세팅 (0) | 2024.05.14 |