본문 바로가기
유니티5 독학 & 게임 제작

유니티5 독학하기 그 53.75걸음-갑작스러운 암초

by 인터넷떠돌이 2018. 7. 8.
반응형

안녕하세요?


원래는 이번 포스팅에서 제대로 완성품을 내 놓으려고 했는데 생각지 못한 암초를 만나서 이래저래 헤메게 되었습니다. 그래서 하는 수 없이 포스팅을 여기서 끊어서 올리고자 합니다. 일단 지난 시간에 4개 속성이라는 버튼을 만들어서 이걸 띄우는 데는 성공했는데, 문제는 원하는 게임 오브젝트에 올려놓지는 못했습니다.



먼저 지난번 포스팅에서 만들어 놓은 적이 있었는 ElementalSwitch라는 게임 오브젝트를 선택 하도록 합니다.



Add Component를 눌러서 Follow Object.cs라는 스크립트를 인스펙터 뷰에서 추가해 주도록 합니다.



다음으로는 인스펙터 뷰로 가서, FollowObject의 설정을 위 스크린샷과 같이 해 줍니다. 그리고 나서 MainCamera는 계층뷰에 있는 GameCamera를 드래그 해 오도록 하고, Ui Camera는 InGame2DUI>Camera를 끌어다가 놓으면 됩니다.



다음으로는 GameManager게임 오브젝트를 선택하는데, 이렇게 원소전환UI와 같이 글로벌 게임동작 처리라고 해야 할까요? 여기저기서 광범위하게 일어나는 게임동작의 처리를 위해서는 GameManager.cs와 같은 싱글톤 스크립트를 사용한다고 합니다.



먼저 위 스크린샥과 같이 광역 변수들을 선언해 주도록 합니다.



스크립트를 저장하고 나가보면, 위 스크린샷과 같이 ElementalSwitchUI라는 항목이 비어있는 것을 볼 수 있습니다.



InGame2DUI>ElementalSwitch를 계층뷰에서 드래그 앤 드롭으로 끌어다 놓아서 지정을 하도록 합니다. 이렇게 하면 스크립트 상에서 변수가 무엇이라고 정확히 선언하지 않아도, 여기 인스펙터 뷰에서 지정이 되는 셈 입니다.



다음으로는 void Start()메소드를 GameManager.cs에 추가하도록 합니다. 각각의 문장이 지니는 의미는 아랫쪽에 있는 주석으로 처리를 해 놓았습니다. 여기에 있는 말의 의미를 다 종합하면 시작하자 마자 elementalSwitchUI가 FollowObject를 얻고 그 다음에 숨긴다는 의미가 됩니다.



다음으로는 ShowElementalSwitch()라는 메서드를 추가해서 원소 전환을 위한 버튼4개를 숨길 수 있도록 만들어 줍니다. 여기서 먼저 위 스크린샷을 보시면 클릭을 해서 타겟이 있으면 elementalSwitchUI의 활성을 true로 하고, 아니면 false로 해서 숨기도록 만든다는 의미가 됩니다.



그런데 갑자기 에러 메세지가 뜨는 것을 볼 수 있었습니다. 아무래도 UIButton을 UIButton[]이라고 하는 배열 안으로 넣을 수 없어서 생기는 문제라는 생각이 듭니다.



일단은 위 스크린샷에 붉은 줄을 친 부분과 같은 곳에서 []를 추가하는 것으로 해결을 하기는 했습니다.



다음으로는 프로젝트 뷰에 있는 Assets/Resources/Prefabs안에 들어가서 PowerSources 프리펩을 선택하도록 합니다.



그리고 나서 위 스크린샷에 있는 PowerSource.cs라는 스크립트를 수정해서 마우스 오른쪽 버튼을 클릭시 원소전환을 위한 UI라는 버튼4가지가 표시가 될 수 있도록 만들어 줍니다.



OnPress()메소드를 추가해서, 여기서 먼저 pressed가 true일 경우, 즉 마우스 클릭이 있을 경우에 if문을 사용하는 식으로 만들었습니다. 여기서 특징 적이라면 특징적인 것으로 2가지가 있는데, 먼저 마우스 왼쪽 버튼을 누르면 -1, 오른쪽 버튼을 누르면 -2의 값을 받는 다는 것입니다.


그리고 dragObject.dragMonvement = 해서 뒤에 new Vector라고 지정을 하면 어느방향으로 움직일 것인지 지정을 할 수 있으며, Vector3.zero라고 하면 아예 움직이지 않도록 만드는 것이 가능하다고 볼 수 있습니다.




다음은 프로젝트 뷰에서 Assets/Resources/Prefabs를 열어서 Ground프리펩을 선택하도록 합니다. 이 작업을 하는 이유는 이제 다른 임의의 장소를 클릭하면 원소전환 버튼이 사라지도록 만드는데, 이 임의의 다른 장소가 될 확률이 높은 지역이 바로 Ground이기 때문입니다.



위 스크린샷처럼 DisableOnClick.cs라는 C#언어를 생성하도록 합니다.



먼저 위 스크린샷과 같이 광역변수 2 종류를 선택하도록 합니다.



스크립트를 저장하고 나서 유니티로 돌아와서 인스펙트 뷰를 보면, 위 스크린샷과 같이 변해 있는 것을 볼 수 있습니다.



먼저 Target항목은 계층뷰에 있는 InGame2DUI>ElementalSwitch를 드레그 앤 드롭해서 놓아 주도록 합니다.



다음으로는 OnPress()라고 해서 마우스를 클릭했을 경우를 상정해서 위 스크린샷과 같이 타겟을 비활성화 시키는 작업에 들어가는데, || 연산자가 or인 것은 이해를 하겠는데, 왜 이리도 좌클릭을 했는지 여부를 이렇게 복잡하게 했는지는 모르겠습니다. 아무튼 우클릭이든 좌클릭이든 그라운드를 클릭하면 타켓=ElementalSwitch는 비활성화 됩니다.



다음으로는 위 스크린샷과 같ㄹ이 DisableOnClick라는 컴포넌트를 복사 하도록 합니다.




그리고 나서 프로젝트 뷰의 Prefabs폴더 안에 있는 PowerFeed라는 프리펩을 선택하도록 합니다.



여기다가 아까 복사한 컴포넌트를 붙여넣기 하도록 합니다.



그리고 나서 다시 이번에는 계층뷰로 가서 PowerFeeds의 하위 항목인 Feed1과 Feed2를 동시에 선택하도록 합니다.



그리고 나서 여기에 있는 DisableOnClick스크립트의 target도 InGame2DUI>ElementalSwitch를 드레그 앤 드롭해서 놓도록 합니다.



그런데 책에서도 나오지 않은 에러가 뜨면서 작업이 되지 않는 것을 볼 수 있었습니다. 에러의 내용은 아래와 같습니다.


ArgumentException: GetComponent requires that the requested component 'UIButton[]' derives from MonoBehaviour or Component or is an interface.

UnityEngine.GameObject.GetComponentInChildren[UIButton[]] (Boolean includeInactive) (at C:/buildslave/unity/build/artifacts/generated/common/runtime/GameObjectBindings.gen.cs:78)

GameManager.Start () (at Assets/Scripts/Game/GameManager.cs:22)


이래서 이래 고치고, 저래 고쳐도 도저히 해결이 되지 않는 문제점이 발생하였습니다. 이에 대해서는 해결책을 찾는 대로 어떻게 해서든 간에 포스팅을 올리도록 하겠습니다.

반응형