스터디/Unity 2018. 11. 11. 01:29

[Unity] 작업노트 - Playmaker 연습하기 5, 두 플레이어의 이동 - 환쟁이님 강좌

환쟁이(slee16) 강좌 따라 연습하기 계속
플레이메이커 예제 #2 - 플레이어의 이동  2

-두개의 오브젝트에서 하나를 선택하여 GameObject에 변수에 저장
-변수에 저장된 오브젝트를 제어

1.Manager_Control 오브젝트. PlayerSelect FSM


Terrain,  플레이어 1, 2 추가 


Manager_Control 오브젝트에 PlayerSelect PlayerMove 두 FSM 추가



CheckObject 스테이트
클릭한 게임오브젝트를 Obj_Object 변수에 저장 <Mouse Pick>
LayerMask에서 Terrain, Invert Mask 선택하면 terrain빼고 다른 레이어만 인식
(Mouse Pick / Mouse Pick Event의 차이는 무엇일까 다음에)



Reset State
오른쪽클릭-Mouse_Cancel- 선택한 오브젝트를 변수에서 해제 

*문제점 

클릭해보면 변수 필드에 Obj_Object의 value가 Player2 오브젝트가 아니라 그 안에 있는 세부 캡슐 조각 Capsule(4)들이 선택딘다.
혹시나 해서 빈게임오브젝트를 상위에 두고 캡슐들을 그 아래로 묶어 다시 프리팹으로 만들보았지만 결과는 그대로.
나중에 실제 게임에서 '얼굴을 클릭하면, 몸을 클릭하면, '이렇게 분할조건을 만드는데는 쓸수있겠지만.. 가장 상위 단위의 오브젝트 (Capsule(8)이 아닌 Plyaer2 )를 선택되게 하려면 어떻게 하면 좋을까?collider 추가?
=> 환쟁님의 답변 : collider 추가 맞음

*오브젝트를 만들때는 위치값, 보는 방향 원점을 항상 첨부터 잘 조정해두자. 


2.Manager_Control 오브젝트. PlayerMove FSM

오브젝트에 PlayerSelect와는 별도로 PlayerMove FSM을 하나 더 생성한다

-Standby 스테이트에 Obj_Check 이벤트 추가 (global 체크). 이후에 PlayerSelect에서 이벤트를 보낼때 사용 
-Check Object 스테이트에 진행 분리
  • 1_PlayerSelectFSM으로부터 GameObject 변수를 받아와서 Obj_Selected 변수에 쌓는다 (global체크)  <Get Fsm Game Object>
  • Select_N Select_Y 이벤트 추가
  • <Get Object Is Null> 오브젝트가 Null 인지 판단하고
    • Null 이면 Select_N 이벤트로 이전 스테이트로 돌아가고
    • Null이 아니면 Select_Y로 Ready To Move 스테이트로 이동

-
-ReadyToMove 스테이트에 마우스 오른쪽/왼쪽 클릭 구분하여 분기
-Mouse_Click , Mouse_Cancel 이벤트 등록
-<Get Mouse Button Down> 액션 추가

-Set target 스테이트에는 MousePick 된 오브젝트를 Obj_Selected 변수에 넣고, 그 위치를 Vec3 변수인 Pos_Pick에 넣게된다
-이때 PlayerSelect와는 반대로 LayerMask 1 을 Terrain을 선택해서 TerraIn만 선택

*위 그림에서  실수를 했음. Obj_Select에 Store를 하는 바람에 Terrain이 움직여버림. 아래와 같이 Pos_Pick만 Store 하도록.




-Move 스테이트에는 <Move Towards> 추가하여 선택된 오브젝트를 Pos_Pick까지 이동하게 한다.
-Ignore Vertical은 Y값 이동 막음
-오브젝트 위치 0.5 거리까지 가면 FINISHED 이벤트가 발생하여 다시 ReadyToMove 스테이트로 이동


마지막으로 1_PlayerSelect FSM으로 가서 Check Object 스테이트에 Send Event Object_Check를 보내준다.

그러면 2_PlyaerMove 의 StandBy 스테이트가 이벤트를 받아 다음 스테이트로 넘어가게 된다.

플레이 결과!

원하는 캐릭터를 왼쪽 클릭하고 땅을 클릭하면 그쪽으로 이동, 우클릭하면 해제하고 다른 캐릭터 선택 가능!

*이걸 만약에 그냥 캐릭터를 좌클릭할때마다 이전에 선택된 캐릭터를 해제하고 해당 캐릭터를 선택하는 방식으로 메카닉을 바꾸려면..
PlayerSelect FSM에서 캐릭터를 우클릭시 Obj_Selected가 Null 인지 아닌지를 체크하는 과정을 한번 더 넣어야할듯


Move 스테이트에 <Smoothy Look At>을 추가하여 좀더 자연스럽게 바라보며 이동하도록 응용해보았다.
프리팹내의 캐릭터 오브젝트가 회전를 첨부터 잘 맞춰두는 것이 중요한것 같다..