본문 바로가기

TIL

[ 24.05.13 ] 내일배움캠프 20일차 TIL - 더블탭, SO, [Serializable]

[ ps ]

 

[ 백준 / C++ ] 9656 : 수열 (tistory.com)

 

[ Unity ]

 

Input System을 활용하여 더블탭에 대응하는 액션을 구현하려면 어떻게 해야 할까.

 

원하는 Action의 Binding Properties를 보면, Interactions에서 Hold, Tap, Press 등등 다양한 입력을 추가할 수 있다.

여기서 Multi Tap을 추가해주면 된다.

Default로 더블탭이 설정되어 있으며, Tap Count를 수정하여 트리플?탭을 설정할 수도 있다.

Input Action Asset

 

Scriptable Object, 줄여서 SO는 유니티에서 데이터 저장 및 관리를 쉽게 해주는 데이터 컨테이너다.

재사용 가능한 데이터를 저장하는 데 사용되며, 코드와 데이터를 분리하여 코드를 더 깔끔하게 만들어준다.

또한 유니티의 인스펙터 창에서 직접 수정할 수 있기에 편리하다(수정 목록들을 코드에서 미리 명시).

using UnityEngine;

[CreateAssetMenu(fileName = "DefaultAttackSO", menuName = "TopDownController/Attacks/Default", order = 0)]
public class AttackSO : ScriptableObject
{
    [Header("Attack Info")]
    public float size;
    public float delay;
    public float power;
    public float speed;
    public LayerMask target;

    [Header("Knock Back Info")]
    public bool isOnKnockback;
    public float knockbackPower;
    public float knockbackTime;
}

 

SO 작성 예시이다.

CreateAssetMenu는 유니티의 Project 창에서 마우스 우클릭 후 Create에서 SO를 선택할 수 있도록 해주는 코드다.

마우스 우클릭 → Create → TopDownController → Attacks → Default를 선택하면 AttackSO를 만들 수 있다.

AttackSO를 만든 직후 인스펙터 창

 

보이는 것과 같이 인스펙터 창에서 데이터를 직접 수정할 수 있다. 

 

마지막으로 class에 [Serializable]를 붙이면 SO처럼 인스펙터 창에서 클래스 데이터를 직접 수정할 수 있다.

정확히는 [Serializable] 키워드를 붙인 클래스를 정의하고,

MonoBehaviour를 상속받은 C# 스크립트에서 해당 객체를 생성하면 가능하다.

using System;
using UnityEngine;

public enum StatsChangeType
{
	Add,
	Multiple,
	Override,
}

[Serializable]
public class CharacterStat
{
	public StatsChangeType statsChangeType;
	[Range(1, 100)] public int maxHealth;
	[Range(1f, 20f)] public float speed;
	public AttackSO attackSO;
}
using UnityEngine;
using System.Collections.Generic;

public class CharacterStatsHandler : MonoBehaviour
{
    [SerializeField] private CharacterStat baseStat;
    public List<CharacterStat> statsModifiers = new List<CharacterStat>();
    
    // ...
}

인스펙터 창