커스텀 에디터 제작을 하게 된 계기가 있다.
커스텀 에디터는 오늘 처음 만져보았다.
문제
게임을 만들어보다가, 몬스터가 피해를 입었을 때 발생하는
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 등 영향을 받는 것이 많다.
그럴 경우에는 적절히 스크립트를 수정해야 할 것 같다.
'기타 > Unity' 카테고리의 다른 글
[Unity Error] 유니티 에러 / Invalid editor window UnityEditor.FallbackEditorWindow (6) | 2019.11.07 |
---|---|
[Unity Lens Flare] 렌즈 플레어 효과 만들기 (0) | 2019.11.07 |
[Unity] 보간하기 (0) | 2019.10.02 |
[Unity LWRP] Game 뷰에서 색이 연해지는 현상 (0) | 2019.07.15 |
[Unity Shader] Outline 외곽선 쉐이더 만들기 (3) | 2019.07.14 |