동구의_C# & Unity_개발일지
2024.02.20 내일배움캠프 39일차 TIL_Unity (심화, 알고리즘) 본문
알고리즘 코드카타 24일차
제일 작은 수 제거하기
문제 설명
정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.
using System;
using System.Linq;
public class Solution {
public int[] solution(int[] arr) {
int v = arr.Min();
int[] answer = arr.Where(x => x != v).ToArray();
if (answer.Count() == 0)
{
answer = new int[] { -1 };
}
return answer;
}
}
3D 게임 개발 고급
플레이어 이동 상태 만들기
시네머신 카메라 적용
플레이어 점프 상태 만들기
추락 만들기
플레이어 공격 상태 만들기
적 만들기
01. 핵심 내용
1-1) 시네머신(Cinemachine)
시네머신(Cinemachine)은 Unity에서 제공하는 고급 카메라 시스템입니다. 이 시스템은 게임, 영화, 애니메이션 등에서 다양한 카메라 워크플로우를 지원하며, 카메라 이동, 추적, 매핑, 블렌딩 등을 쉽게 구현할 수 있도록 도와줍니다. 시네머신은 Unity 2017 버전 이후부터 기본적으로 포함되어 있으며, 유니티 에셋 스토어에서도 추가적인 확장 패키지를 얻을 수 있습니다.
시네머신의 주요 기능과 특징은 다음과 같습니다
- 가상 카메라(Virtual Camera): 시네머신은 가상 카메라를 사용하여 실제 카메라가 없는 상태에서도 여러 가상 카메라의 시점과 속성을 조작할 수 있습니다. 각 가상 카메라는 독립적인 카메라 속성을 가지며, 원하는 순간에 활성화되거나 비활성화될 수 있습니다.
- 카메라 블렌딩: 여러 가상 카메라 간에 자연스럽게 전환하기 위해 블렌딩 기능을 제공합니다. 카메라의 위치, 회전, 시야 등이 부드럽게 전환되어 자연스러운 카메라 이동을 구현할 수 있습니다.
- 트랙링과 추적: 시네머신은 오브젝트나 캐릭터를 추적하여 자동으로 카메라를 따라가도록 지원합니다. 특정 타겟을 추적하거나 경로를 따라 이동하는 카메라 워크플로우를 구현할 수 있습니다.
- 애니메이션 연동: 시네머신은 애니메이션 시스템과 연동하여 카메라의 속성을 애니메이션과 동기화할 수 있습니다.
- 렌즈 세트: 렌즈 세트를 사용하여 렌즈 조작을 편리하게 할 수 있습니다. 줌, 화각, 특수 렌즈 효과 등을 쉽게 적용할 수 있습니다.
점프을 구현하기 위해 힘을 적용하는 코드이다
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ForceReceiver : MonoBehaviour
{
[SerializeField] private CharacterController controller;
[SerializeField] private float drag = 0.3f;
private Vector3 dampingVelocity;
private Vector3 impact;
private float verticalVelocity;
public Vector3 Movement => impact + Vector3.up * verticalVelocity;
void Update()
{
if (verticalVelocity < 0f && controller.isGrounded)
{
verticalVelocity = Physics.gravity.y * Time.deltaTime;
}
else
{
verticalVelocity += Physics.gravity.y * Time.deltaTime;
}
impact = Vector3.SmoothDamp(impact, Vector3.zero, ref dampingVelocity, drag);
}
public void Reset()
{
impact = Vector3.zero;
verticalVelocity = 0f;
}
public void AddForce(Vector3 force)
{
impact += force;
}
public void Jump(float jumpForce)
{
verticalVelocity += jumpForce;
}
}
추락을 자연스럽게 구현 할 수있는 코드이다
public override void PhysicsUpdate()
{
base.PhysicsUpdate();
if (!stateMachine.Player.Controller.isGrounded
&& stateMachine.Player.Controller.velocity.y < Physics.gravity.y * Time.fixedDeltaTime)
{
stateMachine.ChangeState(stateMachine.FallState);
return;
}
}
!stateMachine.Player.Controller.isGrounded: 플레이어가 땅에 닿아 있지 않음을 나타낸다. 이것은 플레이어가 공중에 있음을 의미한다.
stateMachine.Player.Controller.velocity.y < Physics.gravity.y * Time.fixedDeltaTime: 플레이어의 수직 속도가 현재 중력의 영향을 받아 내려오고 있는지를 확인한다.
만약 위의 조건이 모두 참이라면, 플레이어가 떨어지는 상태로 변경한다. 따라서stateMachine.ChangeState(stateMachine.FallState)를 호출하여 PlayerStateMachine의 상태를 FallState로 변경한다.
강의 따라하기
플레이어의 이동과 점프, 적을 만들었다.
오늘의 오류
여기에 오류가 있는데 플레이어가 공격을 하면 제대로 공격을 하지도 않고 움직이지도 않는다..
적은 첫 번째 공격을 잘하는데 플레이어는 공격 모션을 3개나 넣어서 그런지 공격을 누르면 오류가 나타난다...
어디가 오류인 걸까...?
시도 해본 해결 방법
1. 스크립트 다시 작성
2. 파라미터 삭제 후 다시 작성
'Unity' 카테고리의 다른 글
2024.02.27 내일배움캠프 44일차 TIL_Unity (심화, 알고리즘) (0) | 2024.02.27 |
---|---|
2024.02.21 내일배움캠프 40일차 TIL_Unity (심화, 알고리즘) (0) | 2024.02.21 |
2024.02.19 내일배움캠프 38일차 TIL_Unity (심화, 알고리즘) (0) | 2024.02.19 |
2024.02.16 내일배움캠프 37일차 TIL_Unity (숙련, 알고리즘) (0) | 2024.02.16 |
2024.02.15 내일배움캠프 36일차 TIL_Unity (숙련, 알고리즘) (0) | 2024.02.15 |