본문 바로가기

수업 복습

Zombie - 1인칭시점, 크로스헤어 -

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