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.01.22 내일배움캠프 21일차 TIL_Unity (입문, 알고리즘) 본문

Unity

2024.01.22 내일배움캠프 21일차 TIL_Unity (입문, 알고리즘)

mongle_0l 2024. 1. 22. 09:29

내일은 이번 개인과제 제출일이다.

아직 구현해야 될 것이 많아 해설 영상을 도움 받았다.

 

필수요구사항

1. 캐릭터 만들기 (완료)

2. 캐릭터 이동 (완료)

3. 방 만들기 (완료)

4. 카메라 따라가기 (완료)

5. 캐릭터 애니메이션 추가 (미완료)

6. 이름 입력 시스템 (완료)

7. 캐릭터 선택 시스템 (미완료)


알고리즘 코드카타 8일차

짝수와 홀수

문제 설명
정수 num이 짝수일 경우 "Even"을 반환하고 홀수인 경우 "Odd"를 반환하는 함수, solution을 완성해주세요.
public class Solution {
    public string solution(int num) {
        string answer = "";
        if(num % 2 == 0){
            answer = "Even";
        }
        else{
            answer = "Odd";
        }
        return answer;
    }
}


2D 게임 기초 개발 시작

조준(Aim) 시스템
공격 시스템 구현

 

 

01. 핵심 내용

1-1) 쿼터니언(Quaternion)

  • 4차원 복소수를 이용한 회전 표현 방법입니다. (x, y, z, w) 형태로 표현되며, Unity에서 주로 사용됩니다.
  • 오일러 각도(Euler angles)를 사용하여 회전을 표현할 경우 발생하는 짐벌 락(Gimbal Lock) 문제를 피할 수 있습니다.
  • 직관적이지 않고 복잡해 보일 수 있지만, Unity에서는 쿼터니언을 사용하기 쉽게 만들어졌습니다.
  • 직접 값을 변경하거나 계산하는 대신, Unity의 내장 함수를 사용하는 것이 좋습니다 (예: Quaternion.Euler, Quaternion.LookRotation, Quaternion.Slerp 등).
  • 쿼터니언은 일반적으로 "정규화(normalized)"되어야 하는데, Unity에서는 이를 자동으로 처리합니다. 하지만 직접 계산을 할 때는 정규화에 주의해야 합니다.

1-2) 아크탄젠트 (ArcTangent)

  • 아크탄젠트 함수는 삼각함수의 역함수입니다. 특정 비율에 대한 각도를 계산하는 데 사용됩니다.
  • 2차원 공간에서 점 또는 벡터에 대한 각도를 찾는 데 아크탄젠트 함수가 종종 사용됩니다.
  • 예를 들어, 벡터 (x, y)의 경우, Math.Atan2(y, x) 함수를 사용하여 벡터가 x축과 이루는 각도를 라디안으로 얻을 수 있습니다.
  • 아크탄젠트 함수는 사인(sine)과 코사인(cosine) 함수를 이용하여 직각 삼각형에서 빗변의 각도를 계산하는 데 사용될 수 있습니다.
  • 이 기능은 게임 개발에서 많이 사용되며, 특히 객체가 특정 방향을 향하도록 만들거나 두 점 사이의 각도를 계산할 때 유용합니다.

02. 핵심 내용

2-1) 프리팹 (Prefab)

  • 프리팹은 Unity 게임 엔진에서 사용되는 게임 오브젝트를 재사용 가능하고 관리하기 쉽게 만들기 위한 템플릿입니다.
  • 프리팹을 사용하면 게임 오브젝트와 그에 관련된 컴포넌트 및 설정을 미리 정의하고, 여러 장면이나 게임에서 재사용할 수 있습니다.
  • 프리팹은 인스턴스화를 통해 실제 게임 오브젝트로 변환될 수 있으며, 이 때 모든 프로퍼티와 컴포넌트 설정이 복사됩니다.
  • 프리팹의 변경사항은 모든 인스턴스에 즉시 반영되므로, 일관성을 유지하고 일괄적인 업데이트를 쉽게 할 수 있습니다.
  • 프리팹은 레벨 디자인, 재사용 가능한 게임 요소(캐릭터, 아이템, 장애물 등)의 생성, 프로토타이핑 등에 주로 사용됩니다.

2-2) Instantiate 함수 (Unity)

  • Instantiate 함수는 Unity에서 제공하는 메소드로, 주어진 원본 개체의 복사본을 새로 생성하고 이를 반환합니다.
  • 이 함수는 주로 게임 오브젝트, 즉 캐릭터, 아이템, 프로젝타일 등을 동적으로 게임 세계에 추가할 때 사용됩니다.
  • Instantiate 함수는 원본 개체의 모든 컴포넌트와 그 프로퍼티를 복사하여 새 게임 오브젝트를 생성합니다.
  • 이 함수를 통해 생성된 게임 오브젝트는 독립적이며, 원본 개체에 대한 변화는 이에 영향을 주지 않습니다.
  • Instantiate 함수는 원본 게임 오브젝트, 위치 및 회전 정보를 인자로 받을 수 있습니다.
중요한 기능들을 정리해서 알아보자!
private void RotateArm(Vector2 direction)
{
    float rotZ = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;

    armRenderer.flipY = Mathf.Abs(rotZ) > 90f;
    characterRenderer.flipX = armRenderer.flipY;
    armPivot.rotation = Quaternion.Euler(0, 0, rotZ);
}
주어진 방향(direction)에 따라 캐릭터의 팔(armPivot)을 회전시키고, 팔이 어떤 방향을 보고 있는지에 따라 캐릭터와 팔의 렌더러를 뒤집는 역할을 한다.
주어진 방향(direction)에 대한 아크탄젠트를 계산하여 라디안 값을 얻는다.
Mathf.Atan2 함수는 주어진 y 및 x 좌표에 대한 아크탄젠트 값을 계산한다.

(feat. ChatGPT)
이 코드는 보통 캐릭터의 팔이 주어진 방향을 향하도록 하거나, 어떤 방향에 대한 회전을 렌더링할 때 사용됩니다. 회전 각도에 따라 팔을 뒤집고, 그에 따라 캐릭터를 좌우로 뒤집어주는 역할을 합니다.

private void HandleAttackDelay()
{
    if (Stats.CurrentStates.attackSO == null)
        return;

    if (_timeSinceLastAttack <= Stats.CurrentStates.attackSO.delay)
    {
        _timeSinceLastAttack += Time.deltaTime;
    }

    if(IsAttacking && _timeSinceLastAttack > Stats.CurrentStates.attackSO.delay)
    {
        _timeSinceLastAttack = 0;
        CallAttackEvent(Stats.CurrentStates.attackSO);
    }
}
공격 딜레이을 담당하는 코드이다.

 

조준과 공격 시스템을 구현하였다.

오늘의 실수...

아무리 화살을 쏠려 해도 하나밖에 안 나가진다..

Arrow(Clone)가 하나 생성되고 더 이상 생성이 안되는 모습

Delay 부분에 코드를 덜 섰다...하...

이거 때문에 시간을 너무 낭비했다 ㅠㅠ


개인 과제

 

캐릭터

이동

방만들기

카메라 따라가기

이름 시스템을 완료하였다!

우리의 적 TIL을 물리치는 컨셉...이랄까?? 

NPC 대화가 있으면 재밋을 것같다.