3인칭 게임이었던 Zombie를 1인칭으로 바꿔주어야 한다,,,벌써부터 머리 터지는구만~
FPS느낌을 살려주기 위해 만들어뒀던 Cinemachine카메라를 모두 꺼주었다.
그리고 플레이어에게 FPS용 카메라를 만들어주면됨!
그럼 이렇게 FPS시점으로 게임을 할 수있다. 이 게임에선 좌, 우 방향키로 회전을하는데 FPS에선 좌, 우로 이동을 하더라,,
그래서 플레이어 이동코드도 바꿔주기로 했다.
#PlayerMovement 에서 기존Move()를 아래와 같이 수정한다.
Move()
{
//moveDistance에 상,하,좌,우 이동코드 작성
Vector3 moveDistance = (playerInput.move * transform.forward) + (playerInput.rotate * transform.right);
//정규화를 해주지 않았기 때문에 대각선으로 갈 때 속도가 더 빠름
//대각선으로 움직일 때에도 일정한 속도로 움직이기 위해서 정규화를 해줘야 한다.
if(moveDistance.sqrMagnitude >= 1)
{
//moveDistance의 크기가 1 이상으로 넘어갈 때 1로 고정하여
//다시moveDistance에 할당해줌
moveDistance = moveDistance.nomarlized;
}
//플레이어 이동은 보통 fixedUpdate에서 일어나기 때문에 fixedDeltaTime으로 써준다.
moveDistance = moveDistance * moveSpeed * Time.fixedDeltaTime;
playerRigidbody.MovePosition(playerRigidbody.position + moveDistance);
}
private void RotateCamera()
{
mouseX += Input.GetAxis("Mouse X");
//euelrAngles의 자료형은 Vector3
transform.eulerAngels = new Vector3(0f, mouseX, 0f) * Time.fixedDeltaTime * cameraRotateSpeed;
}
#FPSCameraController
private void FixedUpdate()
{
mouseY += Input.GetAxis("Mouse Y") * Time.fixedDeltaTime * mouseSpeed;
//Mathf.Clamp(float value, float min, float max) : value의 최소값, 최대값을 정해서 mouseY에 할당
//= 카메라 상,하 회전을 얼만큼 할 건지 설정
mouseY = Mathf.Clamp(mouseY, -35f, 35f);
//localEulerAngles = 부모 오브젝트의 회전값을 기준으로 회전
transform.localEulerAngles = new Vector3(-mouseY, 0f, 0f);
}
코드를 위와 같이 작성했다면 마우스커서에 따라서 화면을 상,하,좌,우로 회전할 수 있다.
Cross Hair를 만들어주기 위해서 Assets Store에서 맘에들어보이는 Cross Hair를 다운받아온다.
Import를 해 주고 에셋과 코드를 가져오기전에 DemoScene으로 이 에셋이 어떤건지 체험해보고 가져올것만 가져와야한다.
Cross Hair를 이미 만들어진 이미지로 쓸 수도 있지만, 만들어서 쓰는 Cross Hair를 받아왔다.
다운받은 CrossHair의 gap이 어디서 사용되는지 참조찾기로 찾은후, 값을 사용하는 메소드를 찾아온다.
#SimpleCrosshair의 GetGap() { return m_crosshair.gap }을 보면 m_crosshair에 gap이 있는걸 알 수 있다.
본 게임씬에서는 m_crosshair를 반환하는 GetCrosshair() { return m_crosshair }를 사용하면 된다.
본게임의 게임씬으로 돌아와서 SimpleCrossHair스크립트를 Gun에 넣어준다.
#Gun
//변수선언
private SimpleCrossHair crossHair;
public int defaultGap = 10, deltaGap = 0; //Gap의 최소값(기본값), 최대값
private void Awake()
{
crossHair = GetComponent<SimpleCrossHair>();
crossHair.GetCrosshair().gap = defaultGap; //초기값 설정
}
private void Update()
{
//Gap이 늘어났다 줄어났다하는걸 Update에서 실시간으로 재생
crossHair.GetCrosshair().gap = defaultGap + deltaGap;
}
Shot()의 코드를 수정해줘야한다. 쿼터뷰에서 1인칭시점으로 바뀌었기때문에 총구의 방향으로 총이 날라가는게
아니고 메인카메라의 앞방향으로 쏘게끔 해줘야 하기 때문.
private void Shot()
{
RaycastHit hit;
Vector3 hitPosition = Vector3.zero;
if(Physics.Raycast(fireTransform.position, //총구의 포지션에서
Camera.main.transform.foward, //메인카메라의 앞방향으로 == 화면방향으
out hit,
fireDistance))
{
IDamageable target = hit.collider.GetComponent<IDamageable>();
if(target != null)
{
target.OnDamage(damage, hit.point, hit.normal);
}
hitPosition = hit.point;
}
else
{
hitPosition = fireTransform.position + Camera.main.transform.foward * fireDistance;
}
StartCoroutine(ShotEffect(hitPosition));
StartCoroutine(CrossHairControl());
}
완성본
'수업 복습' 카테고리의 다른 글
2D RogueLike (1) | 2023.09.06 |
---|---|
Zombie - MultiPlay - (0) | 2023.08.30 |
Zombie - 좀비(Enemy) 스크립트, 게임오버 UI - (0) | 2023.08.29 |
Zombie 복습2 - 플레이어 스크립트 - (2) | 2023.08.27 |
Zombie - 좀비, 플레이어 UI - (0) | 2023.08.22 |