디스크 골프 [#15] - UI 적용하기
기존 로비씬에 있는 UI가 세련되지 못해서 바꿔주기로 했다, UI에셋은 Mono Round를 사용했다.
전에 만들어 놓은 UIScene에서 테스트로 UI를 구성해봤다.
실제로 게임을 실행해서 적용된 모습을 보았다.
그런데 토글을 선택했을때 토글이 하얗게 변하는 문제가 발생했다.
플레이모드로 실행해본 결과 토글 자식 중 Selection Border가 토글이 선택되었을때 흰색 이미지로 나타나면서 문제가 발생하는 걸 확인했다.
고민하다 Border도 Mono Round의 에셋 버튼으로 바꿔서 토글을 선택했을때 주변에 흰색 사각형이 둘러싸는 느낌으로 만들기로 했다.
그리고 맵사진이 나타나는 부분도 조금 수정해서 모서리 부분이 둥글게 나오도록 마스크를 사용해서 바꾸어주었다.
Not yet을 골랐을때 이미지가 하얗게 출력되는게 싫어서 맵을 고를때 Not yet을 선택하면 이미지를 비활성화하기로 했다.
그래서 맵이미지의 스프라이트가 null값일때 이미지를 비활성화하고 null이 아닐때 이미지를 활성화하려고 했는데 작동하지 않았다.
알고보니 맵이미지의 스프라이트가 아니라 맵이미지를 조건문에 넣어서 그런거였다 바로 바꿔주었다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class LobbyMain : MonoBehaviour
{
enum eMap
{
Mountain,
Island
}
public System.Action<int> onSelectGameScene;
public System.Action onLoadGameScene;
public Toggle[] toggles;
public Button playBtn;
public Image mapImage;
private void Start()
{
for (int i = 0; i < toggles.Length; i++)
{
int j = i;
toggles[j].onValueChanged.AddListener((toggle) =>
{
onSelectGameScene(j);
mapImage.sprite = Resources.Load<Sprite>("Images/" + (eMap)j);
if(mapImage.sprite != null)
{
mapImage.gameObject.SetActive(true);
}
else if(mapImage.sprite == null)
{
mapImage.gameObject.SetActive(false);
}
});
}
playBtn.onClick.AddListener(() =>
{
onLoadGameScene();
});
}
}
그리고 UI의 크기를 가로로 넓혀주었다.
그리고 로비씬에서 주변환경을 실내로 바꿔주었다, 에셋은 무료 라운지에셋을 다운받아서 사용하였다.
로비씬의 UI는 어느정도 끝났으니 연출을 만들어보려고 한다.
지금 생각한 계획은 게임을 시작할때 코스로 골프카가 진입하는 연출을 만드는 것이다.
3d model사이트에서 무료 골프카를 다운받았다.
무료다보니 영 퀄리티가 구져서 조금 손을 봐줘야 할 것 같다.
일단 모델사이트에서 바퀴를 다운받아 새로 달아 주었다.
그리고 바퀴를 바꾼 골프카를 유니티로 임포트해서 레드메탈 메테리얼과 메탈 메테리얼을 만들어서 메테리얼을 입혀주었다.
그렇게 하려다가 에셋스토어의 금속에셋을 사용하기로 하였다.
이제 모델은 완성했고 골프카가 실제 자동차로서 기능하도록 만들어야 할 것 같다.
그러던 중 유니티에 휠콜라이더가 있는게 생각나서 그걸 한번 적용해보면 괜찮을 것 같았다.
https://blog.naver.com/hai_per/221195596908
[Unity5] 유니티에서 자동차 만들기
안녕하세요. 오늘은 유니티에서 자동차를 구현하는 방법을 강의하겠습니다. 먼저 자동차 몸체와 바퀴를 준...
blog.naver.com
다음 사이트를 참고해서 한번 따라 만들어볼 생각이다.
콜라이더를 달아주고
Car스크립트를 Car에 매핑해주었다.
그리고 실행해봤는데 자동차가 움직이진 않고 위아래로 덜덜 떨리기만 하였다, 문제가 무엇일까...
원인을 알게되었는데 자동차를 가만히 놔뒀더니 바퀴가 원래 바퀴위치를 중심으로 회전하면서 움직이기 시작했다.
아무래도 축이 뭔가 잘못된 거 같다.
그래서 바퀴아래에 오브젝트를 만들고 그 오브젝트를 부모로 만들어서 바퀴축을 바퀴위치로 맞춰주었다.
그런데 이번엔 바퀴가 중앙으로 모이는 현상이 발생했다. 아무래도 Wheel Collider가 중앙으로 설정되어 있어서 그런것 같다. 내 생각이 맞는지 검증하기위해 Wheel Collider도 바퀴위치에 맞게 옮겨 주었다.
바퀴는 위치에 맞게 이동했는데, 자동차가 호버자동차가 되버렸다...
한번 Car스크립트를 비활성화해도 같은 문제가 발생하는지 실험해보았다.
Car스크립트를 비활성화하니 정상적으로 작동하는 것을 확인했다, Car스크립트에서 잘못된 부분을 찾아 수정하도록 하자.
먼저 타이어의 포지션과 로테이션부분을 하나씩 주석처리하고 어떤 부분에서 문제가 발생하는지 플레이해보았다. 그리고 바퀴의 로테이션 부분을 주석처리 했을때 바퀴가 회전하는 문제가 사라지는 것을 확인했다.
void UpdateMeshesPostion()
{
for (int i = 0; i < 4; i++)
{
Quaternion quat;
Vector3 pos;
wheels[i].GetWorldPose(out pos, out quat);
tires[i].position = pos;
//tires[i].rotation = quat;
}
}
그래서 Debug로 quat값을 찍어 보았는데 0에 근접한 값이 나왔다. 바퀴 프리펩의 로테이션을 살펴보니
z축이 -90도로 되어있어서 0이 들어가면 바퀴가 눕는 현상이 발생하는 거였다.
프리펩의 이름을 Body로 바꾼다음 빈 오브젝트를 만들어서 그 오브젝트의 자식으로 만들어준 다음 오브젝트를 Car스크립트에 할당해주었다.
그리고 실행시켜보았는데 잘 작동하였다.