카테고리 없음

탕탕특공대 구현 2강

머혀기 2023. 1. 10. 15:58

첫 글은 2D 오브젝트 만들기 강의를 보며 적어보겠다. 아래 URL은 해당 강의 영상이니 같이 따라해보면서 공부해도 좋을거 같다.

https://www.youtube.com/watch?v=YAu4yWU5D5U&list=PLO-mt5Iu5TeZF8xMHqtT_DhAPKmjF6i3x&index=3 

 

오랜만에 글을 써보자!! 지난주동안 이것저것 바뻐서 이제 업로드하게 됐다.. ㅠㅠ 지난 시간에 프로젝트 생성 및 아틀라스 이미지를 통해 스프라이트를 쪼개 플레이어 오브젝트를 생성하는 법을 배웠다! 이번시간엔 생성한 플레이어 오브젝트를 코딩을 통해 움직이도록 구현해보자!

 

자아 가장 먼저 플레이어 오브젝트에 코드를 입력할 수 있도록 c#파일 컴포넌트를 연동시켜줘야 한다.

1. c#파일 컴포넌트 연동

 별거없다! 아래 Add Component를 클릭하고 NewScript를 클리해 파일명을 작서하면 저래 파일이 생성된다.

 한가지 팁을 주면 나중에 여러 오브젝트별로 스크립트가 작성될 수 있으므로 오브젝트별 혹은 씬 별로 스크립트를 관리하는게 나중을 위해 좋다. 여기서 나는 씬 별로 오브젝트를 관리하기위해 Assets/Script/PlayeScean폴더에 Player파일을 생성할거다! (아래그림은 script 폴더만 생성했다... ㅎㅎㅎ ) --> 폴더 생성법은 아래 창을 누르고 오른쪽마우스 ->Create -> folder 와 c# Script를 클릭해 폴더랑 c#파일을 생성할 수있다. 그리구 생성된파일을 우측 Inspector창에 드래그엔 드롭하면 자동으로 적용되니 참고하시길!! 

그림[1] 프로젝트 파일 생성

 

c# 파일을 생성했다면 코딩을 시작해봐야지? 코드를 작성해보자

2. 코드작성

코드는 캡쳐본으로 대체하고 부가설명만 좀 쓰는거로 하겠다.

가장먼저 우리는 유니티 c#파일의 LifeCycle을 알아야한다. 사실상 이게 가장 중요한 부분인데... 설명을 하자면 끝도 없어서.. 관련 링크를 걸어두겠다..

https://velog.io/@minjujuu/Unity-Script-Lifecycle 요거로 가자!

 

[Unity] Script Lifecycle

Unity로 많은 프젝을 했었지만 막상 Life cycle을 물어보면 명확히 대답을 할 수가 없었다 기본 중에 기본이고 처음에 분명 배웠는데ㅠ 그래서 다시 한 번 짚고 넘어가고자 한다!

velog.io

 

자아 다음으로 코드르 봐야지! 아래 순서대로 코드를 구상하는게 좋다!

1-1 변수 선언 

 일반적으론 최상단에 변수를 선언한다. 그때 파일내에서만 변수를 접근할 수 있게 한다면 private 혹은 추가입력을 하지 않는다.(defalt값이 private) 이와 반데로 unity UI화면 혹은 외부 파일에서 접근 가능하도록 하기위해선 public 명령어를 자료형(int,float..)앞에 선언해준다.

https://qzqz.tistory.com/120 요것도 참고자료!

 

C# 접근 제어 (public, protected, private, internal, protected internal)

객체 지향 프로그래밍에서 클래스의 사용자에게 필요한 최소의 기능만 노출하고내부를 감추는 것을 은닉성이라고 합니다. 클래스에 선언되어 있는 필드와 메서드 중 필드는 상수를 제외하고

qzqz.tistory.com

그림[2]와같이 변수를 선언하는데 첫번째 변수는 방향키에따른 이동값을 저장하는 변수, 두번쨰는 속도를 입력하는 변수, 세번째는 물리컴포넌트를 사용하는 변수이다. 여기서 public이 붙은 변수들은 unity UI창에서 그림[3]의 스크립트 컴포넌트같이 변수에 값을 넣을 수 있다. 

(왼)그림[2] 변수 입력 , (오)그림[3] public변수 

 

1-2 물리법칙 컴포넌트 가져오기

물리법칙등 다양한 컴포넌트는 GetComponent<>() method로 사용할 수 있다. 이때 Awake 또는 Start 사이클에서 불러와야 최초 한번만 불러오기 때문에 같은 정보를 불러오는 일을 줄일 수 있다!

그림[4]

1 - 2 오브젝트 이동하기

드디어 오브젝트를 이동해보자!

오브젝트를 이동할때는 주의할 점이 있다! 디바이스별로 프레임값이 다르기때문에 이를 일치 시켜줘야한다. 우린 이것을 위해 Update 사이클에선 Time.deltaTime, FixedUpdate 사이클에선 Time.fixedDeltaTime을 사용한다. 꼭 주의하자.

오브젝트를 이동하는 방법은 총 3가지! (참고로 다음차시에 또 한가지가 있다..)

배워보자!

공통작업으론 방향키를 통해 상하 좌우를 알수 있게 저장하자! 그림[5]와 같이 Update() 싸이클에서 x,y값을 받아와 벡터값을 저장한다.

이떄 좌,우 값은 Horizontal , 상,하 값은 Vertical이다. 이는 그림[6]번과같이 설정할 수 있으니 참고하자!

그림 [5] 방향키에 따른 좌표값 업데이트

 

그림[6] Edit -> ProjectSetting -> Input Manager / Axes 참고 약속된 용어

오브젝트 이동 방법은 총 3가지가 있다. 순서대로 설명해보자!

 

1. 힘을 준다.

rigid.AddForce(inputVec); 와같이 AddForce() method를 사용해 이동가능

2.속도를 제어한다.

rigid.velocity = inputVec; 와같이 velocity즉 속도를 변경한다.

3. 위치이동.

rigid.MovePosition(); 방향을 변경한다.

 

여기선 위치이동을 하는데 주의점은 위에서 말햇듯 프레임에 따르지 않는 공통 deltaTime값과 속도값을 추가로 입력해준다.

//normalized 어느 방향이든 1로 정의 , speed : 속도 , Time.fixedDeltaTime : FixedUpdate 기준 1프레임을 디바이스에 상관없이 공통값을 정의한다.
        Vector2 nextVec = inputVec.normalized * speed * Time.fixedDeltaTime;
        //이렇게만 하면... 요상하게 움질일거에요,, 이동은 모든 디바이스에서 같은 속도로 움직일 수 있게 해야된다...
        rigid.MovePosition(rigid.position + nextVec);

 

자아 이렇게하면 자알 작동한다..

 

(역시 복습은 중요한거같다! 이 좌표값들을 활용하면 방향에 따른 공격 좌표를 지정할 수 있을거 같다!!  비하인드지만... 이 강의는 아직 끝나지 않은 강의여서,, 미리 만들고 있어봤는데  방향에따른 공격 좌표를 어떻게 줘야할지 어려워하고있었는데.. 다시 만들어봐야겠다 ㅠㅠㅠㅠ )

 

 

 

 

 

 

 

 

 

 

 

다음 회차는 새로운 인풋시스템을 적용해볼건데! 좀 간단해서 잘 할 수 있을거같다! 아고 힘들어라 ㅎㅎㅎ 오늘은 여기까지!