Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

동구의_C# & Unity_개발일지

2024.02.20 내일배움캠프 39일차 TIL_Unity (심화, 알고리즘) 본문

Unity

2024.02.20 내일배움캠프 39일차 TIL_Unity (심화, 알고리즘)

mongle_0l 2024. 2. 20. 19:18

알고리즘 코드카타 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 버전 이후부터 기본적으로 포함되어 있으며, 유니티 에셋 스토어에서도 추가적인 확장 패키지를 얻을 수 있습니다.

시네머신의 주요 기능과 특징은 다음과 같습니다

 

  1. 가상 카메라(Virtual Camera): 시네머신은 가상 카메라를 사용하여 실제 카메라가 없는 상태에서도 여러 가상 카메라의 시점과 속성을 조작할 수 있습니다. 각 가상 카메라는 독립적인 카메라 속성을 가지며, 원하는 순간에 활성화되거나 비활성화될 수 있습니다.
  2. 카메라 블렌딩: 여러 가상 카메라 간에 자연스럽게 전환하기 위해 블렌딩 기능을 제공합니다. 카메라의 위치, 회전, 시야 등이 부드럽게 전환되어 자연스러운 카메라 이동을 구현할 수 있습니다.
  3. 트랙링과 추적: 시네머신은 오브젝트나 캐릭터를 추적하여 자동으로 카메라를 따라가도록 지원합니다. 특정 타겟을 추적하거나 경로를 따라 이동하는 카메라 워크플로우를 구현할 수 있습니다.
  4. 애니메이션 연동: 시네머신은 애니메이션 시스템과 연동하여 카메라의 속성을 애니메이션과 동기화할 수 있습니다.
  5. 렌즈 세트: 렌즈 세트를 사용하여 렌즈 조작을 편리하게 할 수 있습니다. 줌, 화각, 특수 렌즈 효과 등을 쉽게 적용할 수 있습니다.

점프을 구현하기 위해 힘을 적용하는 코드이다
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. 파라미터 삭제 후 다시 작성