[Unity 강의] 뱀서라이크 강의 - 아이템 드롭
카테고리: Class VamSurLike
태그: C#, Unity, VamSurLike
Sprite Addressable
✔ 스프라이트(드롭템) 작업 전 addressable 관리
✔ 스프라이트 -> 어드레서블 - sprite가 아니라 png(texture2d)고 내부에 있다.
✔ 로드 부분(LoadAsync)에서 texture2d가 아닌 sprite의 키값을 불러오기 위한 코드
✔ 모든 드롭템을 프리팹으로 등록 x
✔ 공통적인 드롭템은 하나의프리팹만 등록하고 세부적인 걸 코드로 바꾸는 형식(Sprite만 갈아끼우는)
ResourceManager - Load
public class ResourceManager
{
public void LoadAsync<T>(string key,Action<T> callback = null) where T : UnityEngine.Object
{
// 캐시 확인.
if (_resources.TryGetValue(key, out Object resource))
{
callback?.Invoke(resource as T);
return;
}
//⭐ texture2d가 아닌 sprite의 키값을 불러오기 위한 코드
string loadKey = key;
if (key.Contains(".sprite"))
loadKey = $"{key}[{key.Replace(".sprite", "")}]";
// 리소스 비동기 로딩
var asyncOperation = Addressables.LoadAssetAsync<T>(loadKey);
asyncOperation.Completed += (op) =>
{
_resources.Add(key, op.Result);
callback?.Invoke(op.Result);
};
}
}
Gem Spawn, Despawn
✔ MonsterController에 Ondead 부분에 젬 스폰
✔ 스폰에 포지션 값 추가 코드 수정 T Spawn<T>(Vector3 position)
✔ 어떤 몹을 잡았을 때 어떤 잼이 떨어진다
✔ 데이터를 이용해 id로 가능하다.
✔ 지금은 단순하게 색상만 바꾸는
ObjectManager - Gem Spawn,Despawn
public class ObjectManager
{
public HashSet<GemController> Gems { get; } = new HashSet<GemController>();
//⭐ Vector3 position 추가
public T Spawn<T>(Vector3 position, int templateID =0) where T : BaseController
{
System.Type type = typeof(T);
else if (type == typeof(GemController))
{
GameObject go = Managers.Resource.Instantiate(PrefabsName.Gem, pooling: true);
go.transform.position = position;
GemController gc = go.GetOrAddComponent<GemController>();
Gems.Add(gc);
gc.Init();
string key = Random.Range(0, 2) ==0 ? "EXPGem_01.sprite": "EXPGem_02.sprite";
Sprite sprite = Managers.Resource.Load<Sprite>(key);
go.GetComponent<SpriteRenderer>().sprite = sprite;
return gc as T;
}
return null;
}
public void Despawn<T>(T obj) where T : BaseController
{
System.Type type = typeof(T);
else if (type == typeof(GemController))
{
Gems.Remove(obj as GemController);
Managers.Resource.Destroy(obj.gameObject);
}
}
}
이것저것 메모
위에 위치한 것이 먼저 그려져야 어색하지 않다.
✔ edit - Project Setting - Graphics -
✔ Transparency SortMode(Custrom Axis) - x: 0 y:1 z :0
드롭 템 간의 order in layer 규칙 필요
✔ 코드 init 부분에서도 설정 가능
extension
✔ gameobject.util.GetOrAddComponent 대신
✔ gameobject.GetOrAddComponent 만으로 가능
Extension
public class Utils
{
public static T GetOrAddComponent<T>(GameObject go) where T : UnityEngine.Component
{
T component = go.GetComponent<T>();
if (component == null)
component = go.AddComponent<T>();
return component;
}
}
public static class Extension
{
public static T GetOrAddComponent<T>(this GameObject go) where T : UnityEngine.Component
{
return Utils.GetOrAddComponent<T>(go);
}
public static bool IsValid(this GameObject go)
{
return go != null && go.activeSelf;
}
public static bool IsValid(this BaseController bc)
{
return bc != null && bc.isActiveAndEnabled;
}
}
update
✔ baseController update 부분도 Init처럼 사용
어드레서블 라벨
✔ 어드레서블 라벨을 preload로 시작 전 로드할 것을 묶어 로드
오브젝트 풀 에러가능성
✔ 오브젝트 풀 충돌 부분 에러
✔ 이미 죽은 target이 destroy 가 아닌 비활성화이기 때문에
✔ 아직 target으로 설정돼 코드가 실행되면 에러가 발생할 수 있다.
잡담, 일기?
다음 주제
경험치 잼 - 콜라이더로 충돌? 코드에서 수동으로
✔ 몬스터가 죽으면 다양한 아이템들이 나온다
-> 게임 특성상 쌓일 수가 있다.
핵심 - 젬, 몹이 쌓인다면? 어떻게 해야 될까
댓글남기기