기타/Unity

[Unity Editor] 파티클 시스템 크기 줄이기 (커스텀 에디터 제작)

푸쿠이 2019. 10. 29. 13:38

커스텀 에디터 제작을 하게 된 계기가 있다.

커스텀 에디터는 오늘 처음 만져보았다.

 

 

문제


게임을 만들어보다가, 몬스터가 피해를 입었을 때 발생하는

Hit Effect의 크기를 몬스터의 크기에 따라 바꾸고 싶었다.

 

(작은 몬스터에게는 이펙트의 크기를 작게, 큰 몬스터에게는 크게)

 

 

해결 방법


1. Particle System 컴포넌트 -> MainModule에 있는 Scaling Mode -> Local에서 Hierarchy로 바꾼다.

 

2. 오브젝트의 크기를 조절한다.

 

 

 

한가지 더 문제


근데 이게 부모 오브젝트만 바꾸면 안되고, 바꿀 모든 오브젝트의 설정을 바꾸어야 한다.

 

보통 파티클 시스템은 [(부모). (자식,자식,자식,자식)] 이런 식으로 만드는데,

자식오브젝트를 모두 저렇게 바꿔야 한다는 것이다.

 

 

귀찮아서 스크립트를 제작하게 되었다.

 

 

해결 방법


이렇게 커스텀 에디터를 만들었다.

 

ParticleScaler 스크립트 (부모 오브젝트에 달면 됨.)

using UnityEngine;

/// <summary>
/// 파티클 크기를 조절하는 스크립트
/// </summary>
public class ParticleScaler : MonoBehaviour
{
    [HideInInspector]
    public float scaleFactor = 1.0f; // 파티클 크기
    
    /// <summary>
    /// 자신과 모든 자식 오브젝트의 Scaling Mode를 Hierarchy로 변경합니다.
    /// </summary>
    public void ParticleScalingModeChange()
    {
        ParticleSystem[] particleSystemList = GetComponentsInChildren<ParticleSystem>(true); // true를 하면 비활성화 되어있는 오브젝트도 찾아준다.

        for (int i = 0; i < particleSystemList.Length; i++)
        {
            ParticleSystem.MainModule particle = particleSystemList[i].main;
            particle.scalingMode = ParticleSystemScalingMode.Hierarchy;
        }
    }

    /// <summary>
    /// 자신과 모든 자식 오브젝트의 Scale 값을 scaleFactor값으로 변경합니다.
    /// </summary>
    public void ParticleScaleChange()
    {
        ParticleSystem[] particleSystemList = GetComponentsInChildren<ParticleSystem>(true);
        
        for(int i=0; i< particleSystemList.Length; i++)
        {
            particleSystemList[i].gameObject.transform.localScale = Vector3.one * scaleFactor;
        }
    }
}

Editor 역할을 하는 스크립트

using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(ParticleScaler))]
public class ParticleScalerEditor : Editor
{
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
        ParticleScaler scaler = (ParticleScaler)target;

        EditorGUILayout.Space();
        EditorGUILayout.Space();
        EditorGUILayout.Space();
        EditorGUILayout.LabelField("-- 파티클 스케일 변경 툴 --");
        EditorGUILayout.Space();
        EditorGUILayout.LabelField("ScalingMode가 Hierarchy로 되어있어야 Scale 변경이 원활하게 됩니다.");
        EditorGUILayout.LabelField("처음 한번만 실행하면 됩니다.");
        
        if (GUILayout.Button("Hierarchy로 변경"))
        {
            scaler.ParticleScalingModeChange();
        }

        EditorGUILayout.Space();
        EditorGUILayout.Space();

        scaler.scaleFactor = EditorGUILayout.FloatField("파티클 크기", scaler.scaleFactor);

        if (GUILayout.Button("파티클 스케일 변경"))
        {
            scaler.ParticleScaleChange();
        }


    }
}

Editor 스크립트의 위치는 폴더명 Editor 안에 존재해야 한다.

(Editor 이름을 가진 폴더는 여러개여도 되며, 위치는 상관없다.)

 

Scaler 스크립트 위치는 상관없음!

 

 

새로운 문제..


이렇게 파티클 크기 조절이 완성된 줄 알았지만, 정말 크기만 조절이 되었다.

 

팡! 터지는 Spark Effect 같은 경우에는 Speed, Gravity 등 영향을 받는 것이 많다.

그럴 경우에는 적절히 스크립트를 수정해야 할 것 같다.