using UnityEngine;
[CreateAssetMenu(fileName = "MyEditorData", menuName = "Custom ScriptableObject/MyEditorData")]
public class MyEditorData : ScriptableObject
{
public string filePath;
}
우선 string형 하나만 입력받도록 설정해줍니다. 클래스는 ScriptableObject 를 상속 받기만 하면 됩니다.
using UnityEngine;
using UnityEngine.UI;
public class UI_Script : MonoBehaviour
{
public Button testButton;
private void Start()
{
//방법1. 무명 메소드 람다식을 통해 적용
testButton.onClick.AddListener(() => TestButtonDown());
//방법2. delegate를 이용해 적용
testButton.onClick.AddListener(delegate { TestButtonDown(); });
//방법3. (방법1 에서 UnityAction으로 함수를 갖고 있는 방법입니다.)
UnityEngine.Events.UnityAction action = () => TestButtonDown();
testButton.onClick.AddListener(action);
//방법4. (방법2 에서 UnityAction으로 함수를 갖고 있는 방법입니다.)
UnityEngine.Events.UnityAction action2 = (delegate { TestButtonDown(); });
testButton.onClick.AddListener(action2);
}
public void TestButtonDown ()
{
print("Button Down!");
}
}
방법1~4 중에 편한 방법으로 써주면 되겠습니당. (모두 동일한 기능을 합니다.)
버튼이 많거나 동적으로 생성해서 사용해줄 때 AddListener를 이용하여 메소드를 등록해줄 수 있습니다.
(또는 버튼을 누른 다음에 다른 메소드로 변경하는데도 사용될 수 있겠죠?)
2. 화면에서 적용시켜주기.
먼저 스크립트가 있어야 하고, 스크립트 내부에 public으로 선언 된 함수가 있어야 됩니다.
UI_Script 이름의 스크립트를 생성해줍니다.
using UnityEngine;
public class UI_Script : MonoBehaviour
{
public void TestButtonDown ()
{
print("Button Down!");
}
}
이제 게임오브젝트를 하나 생성해주고 UI_Script를 갖고 있게 해줍니다.
오브젝트 이름도 동일하게 UI_Script 로 해주겠습니다.
버튼을 생성해줍니다. 그러면 버튼에 옵션이 나오게 되고 스크립트를 On Click () 으로 넣어줍니다.
using UnityEngine;
[CreateAssetMenu(fileName = "Scriptable_Skill", order = 1004)]
public class Scriptable_Skill : ScriptableObject
{
public Skill skill;
public Sprite sprite;
public float hitPower;
public float sensorDistance;
public float sensorRadius;
}
CreateAssetMenu 를 해당 파일을 생성할 수 있게 만들 수 있다.
생성되는 파일명, 보여질 순서이다. (order를 생략하면 Folder 윗쪽으로 생기게 된다.)
충분히 편리하지만 이미지가 너무 작다는 것이 아쉽기에
인터넷 검색을 해보았고 결국 찾아냈다. 원하는 결과물은 다음과 같다.
새로운 스크립트를 작성해주어 Scriptable_Skill에 대한 에디터를 정의해주어야 된다. 최종적으로
2개의 스크립트를 작성해준다.
using UnityEngine;
[CreateAssetMenu(fileName = "Scriptable_Skill", order = 1004)]
public class Scriptable_Skill : ScriptableObject
{
public Skill skill;
public float hitPower;
public float sensorDistance;
public float sensorRadius;
public Sprite sprite;
}
using UnityEngine;
using UnityEditor; //Editor 상속 받기위해 써줌
[CustomEditor(typeof(Scriptable_Skill))] //해당 타입에 대해 적용을 해준다. (반드시 써줘야됨)
public class Scriptable_SkillEditor : Editor //에디터를 상속 받는다. OnInspectorGUI 재정의 가능
{
private Scriptable_Skill scriptable_Skill;
private Sprite sprite;
private GUILayoutOption[] options;
private void OnEnable()
{
//GUI 옵션 설정. 크기를 위해 설정해줌
options = new GUILayoutOption[] { GUILayout.Width(128), GUILayout.Height(128) };
//Editor에선 serializedObject 를 통해 해당 스크립트에 접근이 가능하다.
//serializedObject.target의 형 변환을 통해 해당 값에 접근이 가능해진다.
scriptable_Skill = serializedObject.targetObject as Scriptable_Skill;
//기존 sprite를 기본으로 해줌.
sprite = scriptable_Skill.sprite;
}
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
EditorGUILayout.BeginHorizontal(); //줄 맞춤을 위해 설정
GUILayout.Label("Source Image"); //라벨 설정. 이 후 값들이 오른쪽으로 정렬 된다.
//EditorGUILayout.PrefixLabel("Source Image"); //라벨 설정. 왼쪽으로 정렬 된다.
//EditorGUILayout.ObjectField 를 통해 이미지를 보이게 할 수 있다.
//(Object, type, allowSceneObject (수정 가능 여부), options)
EditorGUILayout.ObjectField(sprite, typeof(Sprite), false, options);
EditorGUILayout.EndHorizontal(); //줄 마무리
}
}