[멋쟁이사자처럼 부트캠프 TIL회고] Unity 게임개발 3기 34일차
오늘이 목표
0. 게이지 바 고치기
1. 카메라 관련 기능 알아보기
2. 농구공이 날아갈 때 카메라 전환 자연스럽게 하기
3. 사운드 추가해보기
4. 넣었을 때 Text 추가
0. 게이지 바 고치기
아직 min와 max 사이에서 반복하는 기능은 만들지 않아서, 코드로 추가해 줄 것이다.
public void GetPower()
{
if (Input.GetKey(KeyCode.Space))
{
if (moveCount <1)
{
power += 10 * Time.deltaTime;
}
else if (moveCount >= 0)
{
power -= 10 * Time.deltaTime;
}
if (power >= maxPower)
{
moveCount++;
}
else if (power <= minPower)
{
moveCount--;
}
}
간단하게 만들었다, 더 줄일 수 있을 것 같지만 일단 패스
1. 카메라 관련 기능 알아보기
https://febelo0524.tistory.com/39
Unity Animation with method
Animation 개요유니티에서는 Animator로 애니메이션 클립들을 관리하고, 상태를 마꿀 수 있다. *애니메이션 클립 : 하나의 연속된 동작으로 나오는 것들 더 정확
febelo0524.tistory.com
정리 끝 ! 더해서 Cinemachine 같은 기능은 나중에 여유가 된다면 찾아봐야겠다.
2. 공이 날아갈 때, 자연스러운 카메라 전환
물론 ThrowingOject 스크립트에서, enabled를 바꿔 주면 전환이 되겠지만, 나는
카메라에 스크립트를 달고 콜백 함수와 같은 개념들을 사용해서 더 이상 ThrowingObject 스크립트에
코드가 줄줄 늘어나는 것을 막고 싶다.
public Action callCamera;
public void Throw()
{
rb.AddForce(direction, ForceMode.Impulse);
rb.useGravity = true;
power = 0;
callCamera?.Invoke();
}
우선 ThrowingObject 함수에 다음과 같이 카메라의 상태를 변경시킬 함수를 지정해 두고,
새로운 스크립트에
throwingObject = ball.GetComponentInParent<ThrowingObject>();
throwingObject.callCamera += cameraMovement;
public void cameraMovement()
{
Debug.Log("카메라 변경");
mainCamera.enabled = false;
moveCam.enabled = true;
}
카메라를 변경하는 코드를 추가해 주었다.
이로써 Throw()를 실행하면 callCamera가 실행될텐데 이 callCamera는 카메라의 상태를 바꾸는 함수가 추가되어 있다.
(변수 선언하는 것들 잊지 말기)
반대로 바닥에 부딫혔을 때 카메라를 메인 카메라로 바꿔본다.
BallCheck라는 새로운 스크립틀을 ball에다 넣어주고(충돌 체크를위해)
public class BallCheck : MonoBehaviour
{
public Action callCameraStop;
void OnCollisionEnter(Collision collision)
{
Debug.Log("Ball Collision");
if (collision.gameObject.layer == 7)
{
callCameraStop?.Invoke();
}
}
}
충돌 시, Ground Layer(7번) 을 갖고 있는지 알아보고, 맞다면 카메라를 다시 전환하는 함수를 호출한다.
ballScript = ball.GetComponent<BallCheck>();
ballScript.callCameraStop += cameraStop;
public void cameraStop()
{
Debug.Log("카메라 스탑");
moveCam.enabled = false;
mainCamera.enabled = true;
}
이렇게 카메라를 초기화 했더니, 몇 번 던지다 보면 카메라가 바라보는 방향이 달라지는 문제가 발생했다.
지금은 카메라의 위치를 ball의 위치에서 더하고 있다 보니, 날아간 상태에서 땅바닥에 구르다 보면, ball과 함께 카메라가 구르고, 리셋을 눌렀을 때 이 회전 그대로 오게 된다.
//리턴 볼 했을 때, 카메라 회전 조정
originalCameraTransform.rotation = cameraTransform.rotation;
ballScript.callCameraStop += cameraSetRotation;
void cameraSetRotation()
{
cameraTransform.rotation = originalCameraTransform.rotation;
}
을 추가해 주었다.
문제 1: 회전 초기화를 했음에도 초기화가 안되는 카메라
로그를 찍어봐도 ,분명히 초기화가 되었는데 계속해서 다른 곳을 바라보고 있는 카메라..
한참을 고민하다가 혹시 하는 생각에 ThrowingObject에서 Returnball 함수를 다시 보았다.
public void ReturnBall()
{
if (Input.GetKeyDown(KeyCode.R))
{
rb.transform.position = spawnPoint.position;
throwingObject.transform.position = spawnPoint.position;
rb.useGravity = false;
rb.velocity = Vector3.zero;
rb.angularVelocity = Vector3.zero;
callcameraStop?.Invoke();
}
}
분명...썼던 것 같은데 없었다.
그래서 로테이션을 초기화 해주는 작업을 하니 정상 작동했다.
rb.rotation = Quaternion.identity;
문제 1 : 회전 초기화를 했음에도 초기화가 안되는 카메라
현재까지의 진행 상태는 다음과 같다. 자연스러운지는 잘 모르겠지만 일단 OK...
옆에서 보는 것보다 위에서 보는게 조금 더 새로운 시각일 것 같아서 해 보았는데
그냥 옆에서 줌 인/아웃 하는 것도 이뻤을 것 같다.
++ 생각해보니, 애초에 카메라의 rotation은 바뀐 적이 없다. 그냥 ball의 변화에 따라 다르게 보였을 뿐...
그래도 공 회전 생각해서 다음에 쓸 수도 있으니까 남겨놨다.
03. 사운드 추가
사운드 관련해서는 시간 날 때 다시 한 번 정리하는 것으로 하고 일단 사운드를 넣어보자.
사운드는 농구 공이 감지되는 순간 플레이될 것이므로, 그물 소리를 바로 0초에 맞춰서 잘라준다.
이제 감지되었을 때 소리를 추가해준다.
문제 2 : 사운드 싱크 문제
void Update()
{
var ballObject = Physics.OverlapSphere(net.position, sphereRadius, layerMask);
if (ballObject.Length > 0 && !isPlaying)
{
audioSource.PlayOneShot(audioSource.clip);
isPlaying = true;
textObject.SetActive(true);
}
else if (ballObject.Length == 0)
{
isPlaying = false;
}
}
원래 코드는 ballObject.Length가 0보다 크다면 ball hit를 계속해서 재생하는 것이었다.
그러나 전 코드에 사운드 플레이를 넣는다면 사운드가 감지 범위를 벗어나야 들릴 수 있었다.
계속해서 플레이가 덮어씌워지기 때문이다, 그래서 플레이중에는 사운드가 또 플레이되지 않게 바꿨다.
문제 2 : 사운드 싱크 문제
배경 음악과 사운드를 넣고, 싱크를 맞춘 후 플레이한 영상이다.
던지고 넣을 때 사운드 추가, 배경음악 추가
04. 넣었을 때 텍스트 추가
그냥 나오는 것은 어색해서, 구글링을 해 한 글자씩 나오도록 만들었다.
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices.ComTypes;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
public class typingEffect : MonoBehaviour
{
public TextMeshProUGUI text;
private string m_text = "Goal !";
// Start is called before the first frame update
// Update is called once per frame
void Start()
{
StartCoroutine(_typing());
}
IEnumerator _typing()
{
yield return new WaitForSecondsRealtime(0.5f);
for (int i = 0; i <= m_text.Length; i++)
{
text.text = m_text.Substring(0, i);
yield return new WaitForSecondsRealtime(0.5f);
}
}
}
이건 관련 에셋이 따로 있길래, 나중에는 필요하다면 에셋을 사서 할 것 같다.
단순히 타이핑 효과 뿐만 아니라, 이동하고 사라지고 등 별 기능이 다 있다.
뭐 안한거 같은데 벌써 마칠 시간이다.
저녁에는 사운드 관련 개념 공부를 좀 하고, 어제 못했던 레벨 디자인에 관련해서 조금 더 살펴봐야겠다.