레트로의 유니티 게임프로그래밍 에센스

유니티 탑다운 슈터 게임 좀비서바이버 개발일지 2일차

막뇌 2023. 8. 17. 17:43

PlayerMovement 메소드

Move 메소드

    private void Move() {
        Vector3 moveDistance =
            playerInput.move * transform.forward * moveSpeed * Time.deltaTime;
        playerRigidbody.MovePosition(playerRigidbody.position + moveDistance);
    }

Rotate 메소드

 private void Rotate() {
        //calculate relative rotate figure
        float turn = playerInput.rotate * rotateSpeed * Time.deltaTime;
        //Change Gameobject Rotation with Rigidbody
        playerRigidbody.rotation =
            playerRigidbody.rotation * Quaternion.Euler(0, turn, 0f);
    }

카메라 관련 설정

데드존 / 소프트존 / 하드리밋

 

데드존은 카메라가 타겟을 추적할 때, 여유를 두는 지점입니다.

우리가 눈으로 어떤 물체를 쫒는다고 가정하겠습니다.

날아다니는 모기를 잡기 위해서는 모기를 계속 보고 있어야만 합니다.

이 때, 모기가 좌우로 크게 움직이지 않는다면 눈동자만 움직여서 모기를 쫒을 수 있습니다.

쉽게 말해서 눈동자만 움직일 수 있는 범위를 데드존이라고 합니다.

 

눈동자를 굴리다가 모기가 안구의 회전 근육을 조금씩 자극할만큼의 범위로 이동하게 되면 고개를 같이 돌려야 합니다.

데드존을 벗어나 소프트존에 오게 된 것입니다.

소프트존에 타겟이 위치하면 카메라는 부드럽게 회전하며 화면의 준점(Aim)으로 타겟을 맞출 수 있게 합니다.

 

모기가 급격하게 움직여서 안구 회전근육의 한계까지 움직이면 우리는 빠르게 고개를 회전시켜 모기를 쫒아야 합니다.

눈동자를 얼마나 많이 움직이던 관계없이 항상 시야 안에는 모기가 있어야 하기 때문이죠.

인간 기준으로 보면 눈동자의 움직임 한계를 하드리밋이라고 합니다. 눈알을 한쪽 끝으로 보내다 보면 안구 근육에 통증이 느껴지고 부들부들 떨리는 등 더이상 움직일 수 없는 상태가 오죠. 이때는 최대한 빠른 속도로 고개를 돌려야만 모기를 쫒을 수 있겠죠.

하드리밋도 동일합니다. 디지털 세계에서 카메라의 타겟은 절대로 하드리밋을 넘길 수 없습니다. 소프트존안에 반드시 타겟이 위치하죠.

 

 

 

C# 인터페이스

인터페이스 라는 개념은 C#에만 존재하는 개념은 아닙니다. C 언어에서부터 존재 했죠.

인터페이스란 외부랑 통신하는 공개 통로이며 통로의 규격(자료형) 입니다.

인터페이스는 통로의 규격을 강제할 수 있지만, 통로 속에서 어떤 일이 일어날지는 결정하지 않습니다.

 

마치 나사 규격이 별나사 육각나사 니플형 특수형태 나사 등등 다양한데 어떤용도로든 사용할 수 있는 것과 같죠.

충전/통신 케이블과도 비교해 볼 수 있겠네요. USB A타입 C타입, micro 5pin 등등

블루투스와 같은 고유 통신 주파수가 있는 것에 비유 할 수도 있겠네요.

 

 

C# 인터페이스도 다른 언어에서 인터페이스와 크게 다르지 않습니다.

어떤 형태의 메서드를 구현하도록 할지 강제하는 계약, 약속이죠. 인터페이스를 상속받은 형태에서는

여기에는 메서드 이름, 매개변수의 타입, 매개변수의 개수 등이 규격이 될 수 있겠습니다.

C#에서는 헤더파일이 아니라 interface 라는 키워드를 사용해서 인터페이스를 만듭니다.

 

public interface Gun
{
	void Fire(GameObject obj)
}

위와 같이 인터페이스 파일을 생성한다고 가정하고

 

아래처럼 AK-47 클래스를 만들어서 인터페이스를 상속하게 합니다. 정확히는 MonoBehaviour, Gun을 상속 했죠.

public class AK-47 : MonoBehaviour, Gun
{
	public float BulletSpeed = 300f;
    
    public void Fire(GameObject obj)
    {
    	Debug.Log("총 발사");
        Debug.Log("총알 속도는 :" + BulletSpeed);
    }
}

이때 Fire를 오버라이딩하면서 내부 구현은 맘대로 할 수 있는겁니다.

 

느슨한 커플링

 

interface Gun이 있고 이를 상속받은 

class AK-47, class M-16 이 있다고 가정합니다.

 

어떤 충돌 이벤트를 발동 시켜서 충돌시 총이 발사(Fire) 되게 만들고자 합니다.

 

인터페이스가 없다면 물체간에 충돌검사를 하면서 M-16 타입인지, AK-47 타입인지 검사하는 코드를 각각 작성해야 합니다.

인터페이스가 있을 때는 Gun 타입인지 검사하는 코드를 작성하기만 하면 됩니다.

Fire가 하는일이 총마다 다를 수는 있어도, 어차피 약속된 규격의 일을 하는 거니까요. 발사하기만 하면 되고, 발사가 어떻게 되는지 반동은 얼마나 크고 소리는 어떤 소리가 나는지 등등은 신경 쓰지 않으니까요.

인터페이스의 이러한 특징을 느슨한 커플링이라고 합니다.