Giant vs Human 팀프로젝트 개발일지

[Giant vs Human/Unity] 개발일지 - [PC기능]

다모아 2023. 12. 14. 18:19

1. WASD 이동하기

Move

 

 

Movement 메서드를 이용했고, PunRPC로 Photon 서버에서 메서드를 사용해주었다.


2. Turn

Turn

 

W키나 S키를 사용하면 카메라의 앞으로 바라본다.


3. Jump

Jump

RigidBody의 AddForce를 사용해 Impulse 포스타입으로 위로 점프해줬다.

Movement 메서드

Jump메서드를 불러주는 RPC기능

isGround로 체크를 해주면서 땅같은 곳에 태그로 Ground를 넣어주고 Ground체크를 해주면서 무한으로 점프하는 걸 막아줬다.


3-1. Double Jump

 

 

Movement 메서드

 

bool 값으로 isGround가 false이고 item이 1개 이상이고 isSuperJumped가 false이고 Space를 눌렀을 때 일치하면

RPC로 Jump메서드와 itemCountSet메서드를 실행해줬다.

isSuperJumped는 true로 만들어줘서 무한 점프를 방지했다.

 

점프와 똑같이 땅을 만나면 isSUperJumped도 false로 다시 더블점프를 할 수 있게 만들어줬다.


3. Jump 오류 - 무한점프

 

해결법 : isGround라는 bool 값 추가로 Ground 태그를 만났을 때만 True로 만들어서 점프가 무한으로 되지않게 하였다.


4. 아이템 먹기

 

아이템 획득

Player의 아래에 items를 SetActive False 상태로 만들어놓고 Item Cube를 밟으면 활성화하게 만들어줬다.

item 모습

Item 태그가 있는 GameObject를 건드리면 TriggerEnter로 반응하는데

그때 RPC로 GetItem이라는 메서드를 실행시킨다.

 

그리고 이 Player가 만들어질 때 아이템들을 SetActive == False 상태로 만들어준다.

 

GetItem은 이 기능들이 있다.

1. UI상 아이템 갯수 표시

2. 먹은 아이템 수 만큼 아이템 활성화

3. 아이템 갯수 증가

그리고 만약 itemCount가 가지고 있는 item 갯수보다 많으면 itemCount를 최대 5개까지만 고정시켜놔서 6개 먹게되면 한개를 계속 줄이는 기능이 있고 itemCount가 0개보다 낮으면 0개로 만들어준다.

아이템을 먹을 때마다, 쓸 때마다 활성화, 비활성화 되는 모습

 


5. 아이템 사용하기(공격&더블점프)

 

 

아이템 사용하기

 

마우스 왼쪽버튼으로 공격하는데 아이템이 1개 이상일 경우 아이템을 사용한다.

OthersBuffered는 Others이랑 동일하지만 버퍼되고 바로 실행되지 않을 수 있다는 차이가 있다.

 

UseItem()은 아래 기능이 있다.

1. 아이템 사용 후 기존 플레이어 아이템 활성화 되어있던 거 비활성화 시켜주기

2. 아이템 갯수 1개 줄이기

3. UI상 Text에 써주기

4. Rocket(공격아이템) Instantiate해주기 및 Rocket 위치, 회전, 바라보는 곳, 로켓 발사

이렇게 담당하고있다.

 

아이템 사용 기능으로는 공격(마우스 왼쪽클릭)과 더블점프(공중에서 스페이스바 한번 더 클릭)가 있다.

공격기능 [아이템사용]

 

더블점프 [아이템사용]


6. 줄타기 [이동기능]

 

 

 

Update에서 SwapMovement와 DistanceCheck 메서드를 계속 받아주고있다.

 

 

SwapMovement의 기능은

1. Ray를 카메라의 앞으로 쏴준다

2. DrawArrow를 그려준다.

3. hit된 것을가지고 마우스 오른쪽 클릭(Down)하면 그 위치 정보를 hitPoint에 저장해준다.

4. 마우스 우클릭을 꾹 누른 상태면 DrawLine()메서드를 호출하고 elapsedTime(경과시간)을 실행시킨다.

5. 경과시간이 0.2이상이고 hitPoint가 Vector3.zero가 아니고 isHit가 false라면 Player의 useGravity를 false로 만들어준다.

--> hitPoint가 Vector3.zero가 아닌 이유 : Vector3.zero는 찍을 확률이 거의 없어서 그게 아니면 채찍이 나가도록 만듦

--> 무중력 상태로 해주는 이유 : 날아가야함

--> 경과시간을 0.2초 이상으로 한 이유 : 바로 날라가게 하지 않기 위함

6. Lerp로 Player부터 hitPoint까지 날아가게 만들었다.

7. 마우스 우클릭(Up)상태라면 중간에 줄타기를 놔두는 상태

8. 놔뒀을 때 중력작용, 경과시간 0초로 초기화, 라인렌더러 없애고, SwapSettingDefault()메서드 실행

 

6-1. DistanceCheck() 메서드

Update문에서 photonView가 IsMine 상태일 때,

계속 hitPoint와 Player의 거리가 0.1 미만이라면 SwapSettingDefault() 메서드를 호출함

 

6-2. SwapSettingDefault() 메서드

SwapSettingDefault() 기능

1. Player의 중력작용

2. 경과시간 0초로 초기화

3. 라인렌더러 비활성화

--> 해주는 이유 : 줄타기를 하다가 마우스 우클릭을 Up 했을 때 혹은 hitPoint에 도착했을 때 실행시켜 중력작용 등 다시 초기화 시켜주는 것

 

6-3. DrawLine() 메서드

DrawLine()의 기능은 라인렌더러를 그려주는 기능이다.

 


 

7. 카메라 기능[플레이어 따라다니기]

 

 

카메라 Player 따라가기

카메라로는 Cinemachine을 사용해주었다.

 

 

Cinemachine의 Follow, Look At 기능으로 CamTrans를 사용해주었는데

Player를 사용하지 않은 이유는 Player를 사용하면 Ray와 라인렌더러가 메인카메라의 앞으로 쏘기 때문에 Player를 관통하지 못해서 줄타기 기능이 제 기능을 하지 못하는 것도 있고

시점 또한 CamTrans를 Player의 Y축으로 3정도 높게 해주는게 더 PC 시점에서 괜찮은 시점이 나왔다.

 

Follow, Look At 에 CamTrans를 부착해주는 건 GameMain 스크립트가 작동하고있다.

CamTrans
Player의 자식으로 되어있음

 

메인카메라에 CinemachineBrain 부착 후 사용

 

7-1. GameMain Scirpt

 

이렇게 prefabs와 cinemachineFreeLook을 할당받아오고있다.

 

 

 

일단 CreatePlayer() 메서드 안에 camTrans를 찾고 Follow와 LookAt을 할당해주고있다.

 

여기선 SpawnPointGroup이라는 GameObject를 찾아서 그 자식들의 Transform을 받아와 받아온 point들의 값을 뽑고 Player를 랜덤한 point에다가 위치시키는 것이다.

 

PhotonNetwork의 Instantiate로 프리팹이름과 위치 회전을 만들어 GameObject playerGo를 만들어주고

VR쪽의 PlayerInit player를 저장해주고

PC쪽의 Init으로 player를 저장해준다.


8. 발판 [밟으면 보스에게 운석같은거 발사]

 

 

 

 

8-1. 발판

 

 

Update 문에서 발판을 터치하면 2초간 터치를 불가능하게 만들었다.

위치값을 변경해주었고 경과시간을 이용해 터치하면 경과시간이 흘러가서 2초 후 발판이 다시 올라오게 만들었다.

 

 

Player 태그를 만나고 터치가 비활성화 상태라면 발판이 눌러진 듯한 위치 변환효과를 주었고 isTouch 값을 활성화하고 BallSpawn() 메서드를 불렀다.

 

8-2. BallSpawn() 메서드

 

ballGo라는 GameObject를 받아와서 위치와 회전값을 맞춰서 Instantiate해주었다.


9. 중간 결과물