오르막길
[Unity] [AR] Day 4 본문
- 글쓴이는 배워가는 학생이며 업무 내용을 스스로 관리하기 위해 관련 티스토리를 작성, 운영 중입니다.
- 글 내용이 모두 정확하다고 보장할 수 없으며 글쓴이의 개인적인 생각이 담긴 글입니다.
- 제작할 때 참고한 글은 링크를 남겼으며, 남기지 않은 내용은 주변 지인들에게 얻은 팁입니다.
- 조언, 지적, 개선사항 등은 둥글게 부탁드립니다.
[ DAY 4 : 콘텐츠 병합 및 수정 ]
To Do List
- 버튼으로 생성되도록 수정
- BoxMoving와 BallThrowing 콘텐츠 병합
- 캐릭터(박스)와 에너지볼(폭발물) 충돌 시 둘 다 destroy
- 에너지볼(폭발물) 일정 시간 지나면 destroy
- 캐릭터(박스) 하나만 생성되도록 제한
(버튼을 누르면 기존에 생성되었던 오브젝트는 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. 버그 해결
목표치는 다 이뤘지만 여러 번 테스트하던 중 간단한 오류를 발견했다!
생성됨과 동시에 박스와 공이 충돌되어 사라져 버리는 경우가 종종 생기는데
그러면 다음 생성되는 어떤 물체든 카메라에 상속된 후 해제가 되질 않는다.
원인과 해결법은 아주아주 단순했다.
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. 빌드 테스트
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 |