오르막길

[Unity] [AR] Day 4 본문

혼자 개발하기/AR 다뤄보기

[Unity] [AR] Day 4

nanalyee 2021. 7. 22. 20:44
  • 글쓴이는 배워가는 학생이며 업무 내용을 스스로 관리하기 위해 관련 티스토리를 작성, 운영 중입니다.
  • 글 내용이 모두 정확하다고 보장할 수 없으며 글쓴이의 개인적인 생각이 담긴 글입니다.
  • 제작할 때 참고한 글은 링크를 남겼으며, 남기지 않은 내용은 주변 지인들에게 얻은 팁입니다.
  • 조언, 지적, 개선사항 등은 둥글게 부탁드립니다.

 

 

[ DAY 4 : 콘텐츠 병합 및 수정 ]

 

To Do List

  1. 버튼으로 생성되도록 수정
  2. BoxMoving와 BallThrowing 콘텐츠 병합
  3. 캐릭터(박스)와 에너지볼(폭발물) 충돌 시 둘 다 destroy
  4. 에너지볼(폭발물) 일정 시간 지나면 destroy
  5. 캐릭터(박스) 하나만 생성되도록 제한
    (버튼을 누르면 기존에 생성되었던 오브젝트는 destroy)

*Day 03의 11번 추가해야 하는 부분 참고

 

 

 

1. 버튼으로 생성되도록 수정

    // 기존 TouchHelper 스크립트
    // public static bool Touch2 => Input.GetMouseButtonDown(1); // 마우스 오른쪽 버튼으로 대체
    // public static bool IsDown => Input.GetMouseButtonDown(0); // 마우스 왼쪽 버튼으로 대체
    
    // 이렇게 수정
    public static bool resetButton; // 캐릭터 리셋 버튼
    public static bool bombButton; // 폭발물 생성 버튼

... 중략 ...

    // 캐릭터 리셋 버튼
    public void ResetCharacter()
    {
        resetButton = true;
    }

    // 폭발물 생성 버튼
    public void CreateBomb()
    {
        bombButton = true;
    }

버튼 함수 추가

	// 기존 BoxController 스크립트에서 if문 조건 수정
	if (TouchHelper.resetButton)
        {
            Reset(); // 박스 생성
            return;
        }

 

 

2. BoxMoving과 BallThrowing 콘텐츠  병합

기존 강좌에서 클래스 상속으로 진행되었던 BoxController와 BallController스크립트를 같은 씬에 합쳐서 진행하다 보니
내가 원하는 대로 쉽게 되질 않아 상당히 진행이 느렸다 ㅠㅠ
박스는 뚝 떨어지고 공은 포물선으로 날아가야 하는데
박스가 자꾸 포물선으로 날아가는 바람에 중간에 그냥 스크립트를 분리시켜 버렸다.
이제는 원인을 찾아서 사실상 상속시켜서 진행할 수 있는데.. 시간상 이대로 두기로 했다.
마지막에 최적화 단계에 병합하는 걸로 해야겠다...

기존엔 우클/화면 두 손가락 터치가 생성 버튼이었는데
두 개의 버튼을 누르는 것으로 분리하는 단계는 쉬웠다.
그러나 진행이 더뎌진 원인은 크게 두 가지였다.

우선 bool값을 이용한 false 처리 지점의 오류이다.
처음엔 단순히 버튼을 누르면 해당 bool값 true처리해주고 실행된 함수가 끝날 때 false 해주는 방향으로 진행했으나
두 스크립트가 같은 오브젝트에 있다 보니 오브젝트가 두 스크립트 모두에게 영향을 받고 있었다.
이것도 모르고 왜 분리가 안되지 하고 있던 바보..
① 버튼 클릭
② 오브젝트 생성
③ 클릭 해제하면 날아가는 함수 실행
이 네 단계를 각 단계 사이마다 bool값을 처리해 분리해주었다.
ex) ① 버튼 클릭 시점에 resetButton = true
     ② 오브젝트 생성 시점에 resetButton = false (한 번만 클릭해도 무한 생성됨을 막기 위함), 캐릭터 들고 있음 = ture;
     ③ 박스의 경우 if (클릭해제상태 && !공들고있음 && 캐릭터들고있음)로 검사하여
         박스 날아가는 함수가 실행되고 공 날아가는 함수 실행 안되도록 분리

그다음은 해당 오브젝트들의 태그 오류였다.
논리적으로는 스크립트가 잘 작동해야 하는데 되질 않고...
분명히 ball은 Bomb 태그로, box는 Player태그로 설정해 두었는데 되질 않아서
마지막에 혹시나 하는 맘에 태그를 재설정하니 무사히 해결되었다..

 

 

3. 캐릭터(박스)와 에너지볼(폭발물) 충돌 시 둘 다 destroy

    //캐릭터 프리팹에 들어있는 스크립트
    //public ParticleSystem particle;
    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Bomb"))
        {
            //Instantiate(particle, transform.position, transform.rotation);
            Destroy(gameObject);
        }
    }

파티클을 코드를 미리 추가해서 나중에 협업할 팀원이 추가하기 수월하게 해 두었다.

 

 

4. 에너지볼(폭발물) 일정 시간 지나면 destroy

    private void Update()
    {
        // Bomb클래스에서 ball을 던지면
        if (Bomb.isThrowing) 
        {
            ballDestory();
        }
    }

    void ballDestory() 
    {
        Bomb.isThrowing = false; // 초기화
        Destroy(gameObject,2f);
    }

의외로 복병이었던 점이
Update에서 ball을 던지는 순간을 isThrowing로 검사도 해야 하는 것을 깜박하기도 했고
Update함수 안에서 Destroy(gameObject, 시간);으로 해두니까 내가 설정한 시간보다 훨씬 오래 걸렸다..
일시적인 오류인지 원인이 있는진 잘 모르겠다만 이런 식으로 진행하니 그나마 빨라져서 그냥 이렇게 쓰기로 했다.

 

 

5. 캐릭터(박스) 하나만 생성되도록 제한 (버튼을 누르면 기존에 생성되었던 오브젝트는 destroy)

    // 오브젝트(프리팹) 생성
    private void Reset()
    {
        // 기존에 생성된 캐릭터 있는지 검사
        GameObject old = GameObject.FindWithTag("Player");

        if (old != null)
        {
            Destroy(old);
        }
        
        ... 생략 ...
    
    }

생성되기 전 이미 기존에 생성되어있는 캐릭터가 있는지 태그를 통해 검사한다
캐릭터가 있으면 destroy
좋은 코드는 아니지만 간단하고 빠르게 작성하기 간편한 tag와 destroy..

 

 

 

6. 버그 해결

목표치는 다 이뤘지만 여러 번 테스트하던 중 간단한 오류를 발견했다!
생성됨과 동시에 박스와 공이 충돌되어 사라져 버리는 경우가 종종 생기는데
그러면 다음 생성되는 어떤 물체든 카메라에 상속된 후 해제가 되질 않는다.

gif에선 잘 보이지 않지만 생성되지마자 충돌되면 발생하는 버그

 

원인과 해결법은 아주아주 단순했다.
2번에서 설정했던 여러 상태 bool값을 초기화를 안 해줬기 때문! 충돌하는 순간에 초기화해주었다.

    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Bomb"))
        {
            Bomb.bombPick = false;
            ResetChar.characterPick = false;
            //Instantiate(particle, transform.position, transform.rotation);
            Destroy(gameObject);
        }
    }

 

 

 

7. 빌드 테스트

apk 테스트

 

 

 

8. 추가해야 하는 부분

[ ball (비눗방울 등 폭발물로 쓰일 오브젝트) ]

  • 충돌 파티클
  • 던지는 공의 모델링 파일

[ box (주인공 캐릭터) ]

  • 모델링 파일 연동
  • 대롱대롱 애니메이션 연동
  • 내려놓은 박스도 다시 드는 건 가능하나 다시 내려놓을 수도 있도록

'혼자 개발하기 > AR 다뤄보기' 카테고리의 다른 글

[Unity] [AR] Day 8  (0) 2021.07.27
[Unity] [AR] Day 7  (0) 2021.07.25
[Unity] [AR] Day 5~6  (0) 2021.07.25
[Unity] [AR] Day 3  (0) 2021.07.21
[Unity] [AR] Day 1~2  (0) 2021.07.21