유니티 부트캠프 8기/Ch06. Unity 게임 개발 심화 9

이번 프로젝트 아이템 클래스의 상속 구조 정리

이번 프로젝트에서는 아이템을 만들 때 멤버변수 대신에 Scriptable Object를 사용했다Scriptable Object를 시도했다다음은 이번 프로젝트에서 아이템에 사용한 Scriptable Object의 상속 구조도이다  가장 아래에 있는 7개의 클래스로만 객체를 생성하고 있다그 위의 부모들는 객체를 생성하지 않고 있다  또한 이 Scriptable Object를 멤버로 가지는 클래스를 만들었다  또한, 실제 클래스는 아이템 클래스의 마지막 상속을 받은 파생클래스들로 만들었다예를 들어 BaseItem의 상속을 받은 Weapon의 상속을 받은 RangedWeapon의 클래스는using System.Collections;using System.Collections.Generic;using UnityE..

유니티의 == 연산자는 c#의 == 연산자가 아니다

유니티의 비교는 어떤 식으로 이루어질까?중복하여 쌓기가 가능한 아이템의 경우 인벤토리에 있는 아이템을 비교하여 같으면 추가로 쌓고,다르면 다른 슬롯에 쌓는다그러면 같은 것은 어떻게 비교하지? 숙련주차의 강의를 참고하였다 (1-11강 39분부터) // 중복할 수 있는 아이템이라면 ItemSlot GetItemStack(BaseItemDataSO data) { // 모든 슬롯을 조사하여, data가 있는 슬롯이 있다면 리턴 for (int i = 0; i (); // GameObject에서 ItemSlot 가져오기 if (slot.itemData == data && slot.quantity  비교는 slot.itemData == data  에서 ..

기반 클래스의 인터페이스를 파생 클래스에서 가져오는 방법, 인벤토리 중간완성

기반 클래스와 파생 클래스의 관계는 유니티의 parent, child 관계가 아니다 이번에 하려는건파생클래스인 RangedWeapon에서 기반클래스 BaseItem에 붙어있는 IInteractable을 가져오는 것이다 IInteractable은 컴포넌트는 아니고 인터페이스인데과연 GetComponent로 가능할까? 상호 작용을 하는 Interaction의 Update에서 using System.Collections;using System.Collections.Generic;using TMPro;using UnityEngine;using UnityEngine.InputSystem;// 카메라에서 ray를 쏜다public class Interaction : MonoBehaviour{ public flo..

부모에 변수를 선언하지 않고 자식의 자료형(실형식)을 런타임때 가져와서 부모의 자료형에 대입하려면?

부모인 BaseItemDataSO은 선언형식(Declared type)실제 아이템은 BaseItemDataSO의 상속을 받은 Weapon의 상속을 받은 RangedWeapon, MeleeWeaponBaseItemDataSO의 상속을 받은 BulletDataSO의 상속을 받은 각각 총알 등 상속의 상속을 통한 방식으로 구현되어있다즉, 자식의 자식이 실형식(Actual type)이다 BaseItem 스크립트에는 따로 변수 선언을 하지 않은 상태다(자식이 나눠서 가지고 있으니까) 예를 들어 BaseItemDataSO의 상속을 받은 BulletDataSO의 상속을 받은 클래스 중의 하나인 NormalBulletDataSO 가 있을 때using System.Collections;using System.Collec..

Scriptable Object 간의 상속시 주의점

이번 프로젝트가 파이널 전의 마지막 프로젝트이다부족한 것을 연습할 수 있는 마지막 기회다이번에는 아이템을 맡았다파이널 때 사용할 아이템 구조를 여기서 만들고 파이널에 간다면 그만큼 시간상의 이익을 볼 수 있다고 생각했다 아이템을 만들 때 ScriptableObject간에 상속이 가능할까? 기본 아이템의 BaseItemDataSO를 상속받은 WeaponDataSO의 상속을 받은 RangedWeaponDataSO와 MeleeWeaponDataSO를 다음처럼 만들었다using System.Collections;using System.Collections.Generic;using UnityEngine;/// /// Scriptable Object를 이용한 아이템 생성/// 종류를 상세히 구분하여 생성한다/// ..

250326

이번 개인과제는 많이 구현하지 못했다 강의를 다 들으면 나중에 부담이 덜할 것 같아서 강의를 들으면서 진행했는데생각보다 오래 걸렸고NavMesh 관련하여 잊어버린 부분이 많아 버벅했던 부분이 많다 실은 그것보다도 가장 큰 원인은 저번주에 개인적으로 공부하는 그래픽스, 알고리즘에 심취해 있었던게 가장 큰 원인이라고 생각한다과제를 조금 더 일찍 시작했다면... 상태 머신의 원리를 이해한 것에서 만족하기로 했고구현하지 못했거나, 고쳐야 할 부분은 시간이 날때 틈틈히 구현하기로 했다 이번 과제를 통해 복습의 중요성을 깨달을 수 있어서 다행이라는 생각이 들었다

Animator에서 Transition 우선순위 정하기

현재 플레이어의 애니메이션은  Walk로 가는 조건: Walk가 trueExit로 가는 조건: Idle이 false Idle상태에서 Walk로 가는 동시에 Exit도 갈 수 있는 구조로 되어 있다따라서 Walk할때 걷는 애니메이션으로 전환이 안된 것이다 이때 parameter를 늘리지 않고 Transition의 우선순위를 정해서 두 가지 상태가 번갈아 나타나지 않도록 한다위에 있는 것이 우선순위가 높다 Exit를 가장 아래로 내리면 이동시에 Walk 상태로만 전환이 이루어진다

매개변수 default 값

개념으로는 알고 있었지만, 이를 잘 활용할 기회가 없어서 기억의 저편에 있던 내용이다 기존의 매개변수가 없던 것에 갑자기 매개변수를 추가해야하는 일이 생길 수 있다이때 그냥 매개변수를 추가하면 이를 사용하는 모든 부분에서 다 바꾸어야한다 수정을 최소화하는 방법으로 default 값을 설정한다  private void SpawnRandomEnemy(string prefabName = null) {... } 주의할 것은 오른쪽 부터 초기화해야한다유니티 Action도 이런 식으로 되어 있었던 기억이 난다

시네머신(cinemachine)으로 연출효과

메인카메라에 cinemachine brain 추가하고나머지는 가상 카메라로 만들어 관리한다가상 카메라를 만들기 위해서 cinemachine virtual camera를 추가하면 된다 Body설정: 카메라가 어떻게 대상을 Follow하는지 Framing Transposer: 대상을 프레임 안에 가둔다대상으로 한 플레이어가 프레임 내에 고정되어 화면 중앙에만 위치한다이때 카메라가 화면의 왼쪽 끝을 벗어나지 못하게 만들려면 Add Extension > CinemachineConfiner2D 만들고collider로 쓸 오브젝트(맵을 덮을 정도로 커야 한다) 만들어서 추가한다 시네머신으로 연출을 하기 위해서는 카메라들이 여러개 필요하다먼저 Follow Virtual Camera를 만들고Noise에 Basic Mu..