상세 컨텐츠

본문 제목

Untiy 입력시스템

개발생활/Unity Engine

by 한국인맛집 2022. 5. 23. 09:13

본문

반응형

*Update*

 

사용자 입력을 체크하기위해선 Update, FixedUpdate, LateUpdate 

와같은 업데이트 문에서 진행하는것이 맞다. (코루틴을 사용할수도있으나)

 

Update문은 기본적으로 무한반복문이라 생각하면 편하다 Update문은 객체에 컴포넌트가 추가되면 프로그램을 실행하는순간 계속 반복하게 된다. 그러므로 Update문은 사용하지 않으면 지워줘야 한다.

 

나중에 불필요한 반복이 계속 실행되기 때문이다.

 

 

*사용자 입력*

 

사용자 입력을 받을수 있는 Input 클래스가 존재한다.

 

Input.GetKey()
Input.GetKeyUp()
Input.GetKeyDown()

 

GetKey()는 사용자가 키보드 버튼을 누르고 , 다시 땟을때 2번 호출된다.

GetKeyUp()는 사용자가 키보드 버튼을 땟을때 호출된다.

GetKeyDown()은 사용자가 키보드 버튼을 눌렀을때 호출된다.

 

즉 GetKey()를 사용하는것이 아닌  GetKeyDown()으로 사용해야 원하는 동작이 나올것이다.

 

아래코드로 체크해볼수 있다.

 

    
    // Update is called once per frame
    void Update(){
        
        if(Input.GetKey(KeyCode.LeftArrow)){
            Debug.Log("Hello GetKey!");
        }   


        if(Input.GetKeyDown(KeyCode.LeftArrow)){
            Debug.Log("Hello GetKeyDown ?");
        }

        if(Input.GetKeyUp(KeyCode.LeftArrow)){
            Debug.Log("Hello KeyUp");
        }
    }

처음에 설명한것처럼 Debug.Log()는 콘솔창에서 체크할수 있다.

 

 

대신 저 코드를 작성만하고 실행하면 동작은 절대 되지않는다.

 

그이유는 클래스 만 만들어놓고, 게임 객체에 컴포넌트를 추가하지 않았기 때문이다.

 

 

이렇게 해야만 동작한다. (클래스를 Aaa로 만들었기때문에 이렇게보이는것일뿐 여러분이 만든 클래스를 붙여야한다. Aaa를 찾아 넣으면 절대 안되겠죠?)

꼭 빈게임 오브젝트에 추가할필요는없다.

여러분이 필요로하는 카메라, 다른 객체 어디든 붙이면 된다.

 

 

 

그럼 위에 코드 테스트로  사용자의 입력을 체크할수 있었다.

 

객체의 이동을 하기위해 객체의 transform을 수정해줘야한다.

 

 

c#에선 객체의 이동을 하기위해 정말 자주 사용된다.

 

모든 게임오브젝트는 transform을 가지고있기에 아래와같이 사용할수있다.

 

대신 this 는 자기 자신을 말하는것이기때문에. 

 

클래스가 포함된 자기자신을 뜻한다.

this.transform.position = new Vector3(0,0,0);

 

그럼 사용자 가 좌 우로 이동하기 위해선 어떻게 해야할까?

 

 

2차원이기때문에 X,Y 축을 변경하면 되는데

 

X축은 좌우 , Y 상 , 하  라고 생각하면 편하다.

 

 

만약좌측으로 이동을 원하면 X축의 값을 -로 변경해야하고.

우측으로 이동을 원한다면 X축의 값을 +로 변경하면 된다.

 

 

그럼 어떻게 추가해주면 될까?

 

우선 이동시킬 객체정보를 알아야하는데 알수가없다.

 

그러므로 객체를 이동시킬 함수에서  public으로 받는다.

 

 

 

 


public class MyClass : MonoBehaviour{


	public GameObject player;


}

 

다시 유니티로 돌아오면.

 

이동시킬 객체를 드래그 해서 넣어주면 된다.

 

 

 

 

플레이어 만들기.

 

 

 

 

F2키를 누르거나 우측 인스펙터 창에서 이름을 변경해준다.

 

Player로 바꾼다.

 

 

 

이곳에서 이미지가 보이지않는다면 아무 이미지를 추가해주자.

 

우선 현재는 에셋이 없으므로 눈에보이는 아무거나로 수정해주면된다.

 

 

Player를 드래그한다 

 

 

 

사용자 입력을 체크하기위해 enum값을 이용해 키 클릭여부를 체크할 예정이다.

 

public enum PLAYER_DIR { NONE = 0, LEFT = 1, RIGHT = 2};
public PLAYER_DIR DIR = PLAYER_DIR.NONE


public void Update(){
	
		if (Input.GetKeyDown(KeyCode.LeftArrow)) {
                // 왼쪽으로 이동
            Logics.Instance.DIR = Logics.PLAYER_DIR.LEFT;
        }
        else if (Input.GetKeyUp(KeyCode.LeftArrow)){
        		// 키를 땟을때
            Logics.Instance.DIR = Logics.PLAYER_DIR.NONE;
        }


        if (Input.GetKeyDown(KeyCode.RightArrow)){
            //오른쪽으로 이동
           Logics.Instance.DIR = Logics.PLAYER_DIR.RIGHT;
        }
        else if(Input.GetKeyUp(KeyCode.RightArrow)){
        	// 키를 땟을때
            Logics.Instance.DIR = Logics.PLAYER_DIR.NONE;
        }

}

 

이제 플레이어의 이동을 하기위해 플레이어에게 이동을 주면된다.

 

public float speed = 10f;

private void FixedUpdate(){

        if (DIR == PLAYER_DIR.LEFT){
            player.transform.position -= new Vector3(speed * Time.fixedDeltaTime, 0, 0);
        }
        else if(DIR == PLAYER_DIR.RIGHT){
            player.transform.position += new Vector3(speed * Time.fixedDeltaTime, 0, 0);
        }

}

 

public으로 체크하면 플레이어의 속도값에 따라 어느정도 수정할수 있다.

 

이제 플레이를 눌러 확인하면서 수정할수 있다.

 

 

반응형

관련글 더보기