[Unity 강의] 뱀서라이크 강의 - 아이템 드롭

업데이트:

카테고리:

태그: , ,




Sprite Addressable

✔ 스프라이트(드롭템) 작업 전 addressable 관리
✔ 스프라이트 -> 어드레서블 - sprite가 아니라 png(texture2d)고 내부에 있다.
✔ 로드 부분(LoadAsync)에서 texture2d가 아닌 sprite의 키값을 불러오기 위한 코드
✔ 모든 드롭템을 프리팹으로 등록 x
✔ 공통적인 드롭템은 하나의프리팹만 등록하고 세부적인 걸 코드로 바꾸는 형식(Sprite만 갈아끼우는)

Image

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으로 설정돼 코드가 실행되면 에러가 발생할 수 있다.





잡담, 일기?

다음 주제
경험치 잼 - 콜라이더로 충돌? 코드에서 수동으로
✔ 몬스터가 죽으면 다양한 아이템들이 나온다
-> 게임 특성상 쌓일 수가 있다. 핵심 - 젬, 몹이 쌓인다면? 어떻게 해야 될까




📔

댓글남기기