3기 33일차 333! 오늘도 시작 !
오늘 해야할 일
- 애니메이션 타이밍 조정 + 애니메이션 관련 함수들 알아보기(따로 포스팅 예정)
- 카메라 관련 기능들 알아보기(게이지 바를 위한)
- 게이지바로 Power 조정하기
- 씬 상에 화살표 표시하기
- 레벨 디자인 개념 알아보기
다 못할 가능성이 높지만 일단 출발~
1. 애니메이션 타이밍 조정
https://febelo0524.tistory.com/39
Unity Animation with method
Animation 개유니티에서는 Animator로 애니메이션 클립들을 관리하고, 상태를 마꿀 수 있다. *애니메이션 클립 : 하나의 연속된 동작으로 나오는 것들 더 정확히
febelo0524.tistory.com
열심히 애니메이션,애니메이터 관련 함수들과 Blend, layer를 공부하고 왔더니,
내 캐릭터는 2D 스프라이트로 만들었기에 자연스러운 동작 제어가 불가능했다.
원래는 자연스럽게 손을 앞으로 내밀고 공을 잡고 있게 만들고 싶었는데 이게 힘들어 졌으니,
조금은 부자연스럽더라도 던질때와만 싱크를 맞추기로 했다.
(GameObject를 분리하여 설정하는 것은, 시간 문제상 패스)
이제, 애니메이션 타이밍과 던지기 타이밍을 맞춰준다.
public void ThrowAnimation()
{
if (throwingObject != null && Input.GetKey(KeyCode.Space))
{
Player.GetComponent<Animator>().Play("Throw");
StartCoroutine(time());
}
}
public void Throw()
{
throwingObject.GetComponent<Rigidbody>().AddForce(direction, ForceMode.Impulse);
throwingObject.GetComponent<Rigidbody>().useGravity = true;
}
원래 하나의 코드였던 코드를 둘로 나눠준 후 , 애니메이션의 이벤트 시스템을 이용했다.
공을 손에 갖고 있다 던지는 것처럼 표현하고 싶지만, 아직은 방법이 떠오르지 않는다.
1. 손에 공 이미지를 붙여두고, 저 위치에 있는 공 이미지를 off 해 둔 뒤, 던질 때 on 하는 방식
2. 카메라 관련 기능들 알아보기
생각해보니 UI로 할 거면 새로운 카메라가 필요 없다.
지난번, 카메라를 하나 더 두고 효과를 준 것은 WorldToScreenPoint , ScreenPointToLoaclPointInRectangular 와 같은 함수를 사용하기 위해서였던것 같다.
3. 게이지바로 Power 조정하기
예전에 했던 대포 발사를 기억하며 슬라이더 바를 만들고, 초록색으로 fill 부분을 바꾸고,
poewr / MaxPower를 설정하며 잘 작동 되는지 체크하려 했는데 !
문제 1 : Expensive method invocation
살려주세요... 진짜 처음 보는 오류에요...
비싸다.. ? 저번에 얼핏 들었던 GetComponent는 무거운 함수라 잘 사용하지 않는다 ! 라고 누군가 알려주신게 기억나서
Start에 rb라는 이름으로 캐싱해두고 해야겠다고 생각했다.
또 생각을 잘못했던게 , start에서 바로
Rigidbody rb = throwingObject.GetComponent<Rigidbody>();
로 캐싱 하고 왜 안되지.. ? 생각하고 있었다.
당연히 전역변수로 rb를 만들어 두고, rb =~ 으로 해야 하는건데 ...
아직 개념이 조금 부족한가보다.
그렇게 오류가 떴던 것들 (Rigidbody와 animator)를 캐싱해주고 플레이 하려는데 .. ?
아직도 이건 왜 그런지 모르겠다.
Expensive method invocation : 비용이 많이 드는 메서드 호출이 자주 이루어질 때
성능 문제를 초래할 가능성이 있는 코드를 식별, 자주 호출되는 메서드 안에서 불필요한 작업이
반복적으로 수행될 경우 표시.
Debug.Log는 디버깅 목적으로, 호출할 때마다 성능 비용을 발생시킴. FixedUpdate같이 짧은 간격으로
자주 실행되는 메서드에서 Debug하면 이런 경고를 표시, 그러나 호출 조건을 제한했으므로 일단은 넘어감.
문제 2 : 던질까 말까 던질까 말까
분명 계속 스페이스바로 입력을 넣어주었는데, 던지지 않는 경우도 있고 던지는 경우도 있었다.
이는 FixedUpdate문에서 모든 함수를 적용했기에 생긴 문제였다.
FixedUpdate는 물리 연산을 처리하며 일정 시간 간격으로 호출된다. (기본값 : 0.02초)
GetKeyUp은 키를 뗀 프레임에서만 동작하지만 FixedUpdate가 호출되는 시점과
입력 이벤트가 발생한 시점이 일치하지 않을 수 있다. 이로인해 놓치는 경우가 발생한다.
그러니까, GetKeyUp은 키를 뗀 프레임에서만 True 값을 반환하는데, FixedUpdate가
이를 듬성듬성 (0.02초)씩 검사하므로 일치하지 않는다면 던지지 않는 것이었다.
그럼 돌아오는 것도 그랬어야 했는데.. ? 라며 다시 동작했는데, 그동안 모르고 있었다.
ㅎㅎㅎㅎㅎ아무튼 해결 !
또, FixedUpdate에서 Update로 바꿨을 뿐인데 목표 오브젝트(작은 공)의 속도가 달라지길래
time.deltaTime을 곱해주었는데 왜 ! 라고 생각했지만 안곱했었다. 고칠걸 안 셈이니까 럭키비키
게이지바 해결 !
4. 씬 상에 화살표 표시하기
Direction은 정해졌으니, 기즈모로 화살표를 표시해줄 것이다.
기즈모 관련 공부를 좀 해보았는데, 기즈모는 화살표를 표시하기에 적합하지 않은것 같다.
https://febelo0524.tistory.com/40
Gizmos 관련 메서드
Gizmos : 유니티에서 디버깅 목적으로 사용되는 시각적인 도구Scene 창에서만 보임, 게임 실행중에는 보이지 않음Scene 창 상단의 Gizmos버튼을 클릭하여 활성화 가능OnDrawGizmos / OnDrawGizmoSelected 메서
febelo0524.tistory.com
그래서 이미지를 찾아와 방향을 바라보게 만들어 줄 것이다. 그림 이미지는 무료 화살표 이미지를 사용했다.
이미지를 잘 변환해주고, Material을 새로 생성해서 넣어준 다음
라인 렌더러의 Material로 설정해준다.
이제 코드를 작성한다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ArrowMove : MonoBehaviour
{
public GameObject directionObject;
public GameObject ball;
private LineRenderer lineRenderer;
private ThrowingObject throwingObject;
private Vector3 direct;
private float power;
void Start()
{
lineRenderer = GetComponent<LineRenderer>();
lineRenderer.positionCount = 2; //시작점 끝점 ??
}
void Update()
{
power=throwingObject.power;
GetDirection();
lineRenderer.SetPosition(0, ball.transform.position );
lineRenderer.SetPosition(1, (ball.transform.position + direct * power/10) );
}
void GetDirection()
{
direct = directionObject.transform.position - ball.transform.position;
direct.Normalize();
}
}
부모 오브젝트에 있는 direction을 가져오려다가, 그냥 사용할 수 있는 object가 둘 다 있길래 새로 구했다.
power/10 같은 숫자는 임의로 설정했다.
다음과 같은 결과물이 나왔다.
생각보다 화살표가 이쁘지 않다... 난 자연스럽고 이쁜 화살표를 기대했는데
코드로 어떻게 더 바꿔볼 수 없을까 ?
원래는 시작점의 x좌표를 + 0.5 더 해서 구했었는데, 처음과 끝이 잘 보이기는 하지만 공의 위치랑 잘 맞지 않아서 포기했다. 다른 방식을 내일 생각해 보면서 여쭈어 보기도 해야지.
5. 레벨 디자인 개념 알아보기(실패)
사실 제일 재밌을 것 같아 기대하던 시간이지만... 아쉽게도 시간 부족으로 다음으로 넘겨야 할 듯 하다.
그리고 더해서 카메라 움직임을 구현하고 싶다, 2번에서는 예전에 인벤토리 만들었던 것처럼 카메라 두 대가 있을 때
어떻게 공존하는지에 대한 것을 알아보려 했다면, 이제는 딱 던졌을 때 카메라가 공을 따라가게 하고 싶다.
'TIL' 카테고리의 다른 글
[멋쟁이사자처럼 부트캠프 TIL회고] Unity 게임개발 3기 34일차 (2) | 2024.12.25 |
---|---|
[멋쟁이사자처럼 부트캠프 TIL회고] Unity 게임개발 3기 34일차 (3) | 2024.12.23 |
abstract, Interface (1) | 2024.12.21 |
[멋쟁이사자처럼 부트캠프 TIL회고] Unity 게임 개발 3기 31일차 (0) | 2024.12.20 |
[멋쟁이사자처럼 부트캠프 TIL회고] Unity 게임 개발 3기 30일차 (0) | 2024.12.20 |