2014년 5월 1일 목요일

Unity_Effect Manager.cs


Explanation.

이전에 프로젝트에서 사용했던 Effect Manager 저장용
Effect 전용 카메라 생성후 
카메라 내부에 Effect Manager Script Add

카메라기준 이펙트 스폰 위치의 local position값을 기준으로
이펙트 생성.


TODO.
Wolrd position값을 기준으로 effect생성?
PlayType별로 effect play


EffectManager.cs
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class EffectManager : MonoBehaviour
{
    #region Singleton
    private static EffectManager sInstance;

    public static EffectManager GetInstance
    {
        get
        {
            if (sInstance == null) sInstance = (EffectManager)FindObjectOfType(typeof(EffectManager));

            if (sInstance == null)
            {
                if (GameObject.Find("Singleton"))
                {
                    GameObject goInst = GameObject.Find("Singleton");
                    sInstance = goInst.AddComponent<EffectManager>();
                }
                else
                {
                    GameObject goInst = new GameObject("Singleton");
                    sInstance = goInst.AddComponent<EffectManager>();
                }
            }
            return sInstance;
        }
    }
    #endregion

    public EffectObject[] _Effects;

    public Dictionary<EffectType, EffectObject&g; Effects = new Dictionary<EffectType, EffectObject>();


    public void Spwan(EffectType type, Vector2 pos)
    {
        Effects[type].Spawn(pos);
    }

    private void Awake()
    {
        Initialize();
    }

    private void Initialize()
    {
        for (int i = 0; i < _Effects.Length; i++)
        {
            _Effects[i].Initialize(this.transform);
            Effects.Add(_Effects[i]._Type, _Effects[i]);
        }
    }
}

[System.Serializable]
public class EffectObject
{
    public GameObject _Effect;
    public EffectType _Type;
    public int _Length; // 한화면에 보여질 최대 이펙트 숫자.
    private List<GameObject> mList = new List<GameObject>();
    private int mIndex = 0;


    public void Spawn(Vector2 pos)
    {
        mList[mIndex].transform.localPosition = pos;
        mList[mIndex].particleSystem.Play();
        mIndex++;
        if (mIndex == _Length) mIndex = 0;
    }

    public void Initialize(Transform trans)
    {
        GameObject parent = new GameObject(_Type.ToString());
        parent.transform.parent = trans;
        for (int i = 0; i < _Length; i++)
        {
            GameObject tmp = MonoBehaviour.Instantiate(_Effect) as GameObject;
            tmp.name = i.ToString();
            tmp.transform.parent = parent.transform;
            tmp.transform.localScale = new Vector2(1, 1);
            mList.Add(tmp);
        }
    }
}

public enum EffectType
{
    Once,
    Loop,
    Move,
    Last
}
(e.g)
Categories:

0 개의 댓글:

댓글 쓰기