using System;
using System.Collections.Generic;
public static class EventBus
{
private static Dictionary<string, Action> eventDictionary = new Dictionary<string, Action>();
public static void Subscribe(string eventName, Action listener)
{
if (eventDictionary.TryGetValue(eventName, out Action thisEvent))
{
thisEvent += listener;
eventDictionary[eventName] = thisEvent;
}
else
{
thisEvent = listener;
eventDictionary.Add(eventName, thisEvent);
}
}
public static void Unsubscribe(string eventName, Action listener)
{
if (eventDictionary.TryGetValue(eventName, out Action thisEvent))
{
thisEvent -= listener;
if (thisEvent == null)
{
eventDictionary.Remove(eventName);
}
else
{
eventDictionary[eventName] = thisEvent;
}
}
}
public static void Publish(string eventName)
{
if (eventDictionary.TryGetValue(eventName, out Action thisEvent))
{
thisEvent?.Invoke();
}
}
}
using UnityEngine;
public class Listener : MonoBehaviour
{
private void OnEnable()
{
EventBus.Subscribe("TestEvent", OnTestEvent);
}
private void OnDisable()
{
EventBus.Unsubscribe("TestEvent", OnTestEvent);
}
private void OnTestEvent()
{
Debug.Log("TestEvent received!");
}
}
using UnityEngine;
public class Publisher : MonoBehaviour
{
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
EventBus.Publish("TestEvent");
}
}
}
<출처 챌린지반 강의노트>
using UnityEngine;
public class LayerMaskExample : MonoBehaviour
{
public LayerMask layerMask; // 검사할 레이어 마스크
void Start()
{
// 이름으로 레이어를 가져와서 레이어 마스크에 추가
int layerNumber = LayerMask.NameToLayer("MyLayer");
layerMask = 1 << layerNumber;
// 기존 레이어 마스크에 새로운 레이어를 추가
layerMask |= (1 << LayerMask.NameToLayer("AnotherLayer"));
}
void Update()
{
// 카메라가 바라보는 방향으로 레이캐스트를 수행
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
// 지정한 레이어 마스크를 사용하여 레이캐스트를 수행
if (Physics.Raycast(ray, out hit, Mathf.Infinity, layerMask))
{
// 레이캐스트가 특정 레이어의 객체에 충돌한 경우
Debug.Log("레이캐스트가 " + hit.collider.name + " 에 충돌했습니다.");
}
// 특정 레이어 번호를 검사
if (hit.collider != null)
{
if (hit.collider.gameObject.layer == LayerMask.NameToLayer("MyLayer"))
{
Debug.Log("충돌한 객체는 MyLayer에 속합니다.");
}
else if (hit.collider.gameObject.layer == LayerMask.NameToLayer("AnotherLayer"))
{
Debug.Log("충돌한 객체는 AnotherLayer에 속합니다.");
}
}
}
}
public enum ItemType{
Armor = 1,
Potion = 2,
Accessory = 3,
Belt = 4,
...
}
[Flags]
public enum CharacterState
{
None = 0,
Idle = 1 << 0,
Running = 1 << 1,
Jumping = 1 << 2,
Attacking = 1 << 3,
Defending = 1 << 4
}
[Flags]
public enum EquipStatus{
Nothing = 0,
LeftHand = 1 << 0,
RightHand = 1 << 1,
Both = LeftHand | RightHand
}
public class Character : MonoBehaviour
{
public CharacterState currentState;
void Start()
{
// 상태 설정
currentState = CharacterState.Idle | CharacterState.Defending;
// 상태가 Idle인지 확인
if ((currentState & CharacterState.Idle) == CharacterState.Idle)
{
Debug.Log("캐릭터가 Idle 상태입니다.");
}
// 상태가 Defending인지 확인
if ((currentState & CharacterState.Defending) == CharacterState.Defending)
{
Debug.Log("캐릭터가 Defending 상태입니다.");
}
}
void Update()
{
// 상태 변경 예시
if (Input.GetKeyDown(KeyCode.Space))
{
currentState |= CharacterState.Jumping;
Debug.Log("캐릭터가 Jumping 상태로 변경되었습니다.");
}
if (Input.GetKeyDown(KeyCode.A))
{
currentState &= ~CharacterState.Defending;
Debug.Log("캐릭터가 Defending 상태를 해제했습니다.");
}
}
}