【Unity】MonoBehaviour.Reset() 사용 방법

10376 단어 UnityEditorUnityC#

시작


자체 제작 스크립트에서 검사기로 구성 요소를 조금씩 분배하는 것은 매우 번거롭다.
이때 사용할 수 있는 정보는 MonoBehaviour의 Reset () 입니다.
의외로 유연하고 편리하지만, 그다지 사용되지 않습니까?느꼈기 때문에 사용법의 예를 소개해 주십시오.

Reset()


https://docs.unity3d.com/ja/current/ScriptReference/MonoBehaviour.Reset.html
이것은 편집기에서 구성 요소를 초기화할 때 부르는 방법입니다.
구체적으로 검사기에서 구성 요소를 추가할 때
마우스 오른쪽 버튼이나 톱니바퀴 아이콘을 클릭하고 나타나는 메뉴에서 Reset을 선택하면 호출됩니다.


사용 방법


직렬 필드 값을 초기화하는 데 주로 사용됩니다.
그럼에도 불구하고 선언문에 값을 대입하면 구성 요소/Reset을 추가할 때 임의로 값을 설정합니다
충분하면 Reset () 을 준비할 필요가 없습니다.
    [SerializeField]
    private int _testValue = 100;   // 特に何もしなくてもResetしたら100に戻る

성명에 대입할 수 없는 값을 초기화하는 데 사용합니다


선언문에 대입할 수 없는 값을 기본값으로 설정하고 싶습니다. (그리고 검사기에서 임의로 변경할 수 있도록 하고 싶습니다.) 이럴 때 Reset () 의 등장입니다.
ResetTest.cs
using UnityEngine;

public class ResetTest : MonoBehaviour
{
    [SerializeField]
    private Rigidbody _rigidbody = null;

    [SerializeField]
    private Transform _child = null;

    [SerializeField]
    private Camera _mainCamera = null;

    [SerializeField]
    private Light _lightInScene = null;

    [SerializeField]
    private Texture _textureInResources = null;

    [SerializeField]
    private Texture _textureInAssets = null;

    [SerializeField]
    private float _rigidbodyMass = 0f;

    private void Reset()
    {
        // 一緒に付いているコンポーネントをセットする
        _rigidbody = GetComponent<Rigidbody>();

        // 子オブジェクト「Child」をセットする
        _child = transform.Find("Child");

        // メインカメラをセットする
        _mainCamera = Camera.main;

        // シーン中のLightコンポーネントをセットする
        _lightInScene = GameObject.FindObjectOfType<Light>();

        // Resources中のTextureアセットをセットする
        _textureInResources = Resources.Load<Texture>("texture");

#if UNITY_EDITOR
        // Resources外のTextureアセットをセットする
        _textureInAssets = UnityEditor.AssetDatabase.LoadAssetAtPath<Texture>("Assets/Textures/texture.png");
#endif

        // 参照取得済み他コンポーネントの値を使ってセットする
        if (_rigidbody != null)
        {
            _rigidbodyMass = _rigidbody.mass;
        }
    }
}
이것을 Conponent에 추가하면 이렇게 임의로 설정된 상태가 됩니다
물론 이후에 모든 필드를 자유롭게 변경할 수도 있고 상기 상태로 재설정할 수도 있다.

다른 구성 요소의 설정 값 변경하기


다른 구성 요소의 설정 값도 변경할 수 있습니다.
    private void Reset()
    {
        // Transformの位置を変更
        transform.position = new Vector3(100f, 100f, 100f);

        // Rigidbodyのconstraintsを変更
        var rigidbody = GetComponent<Rigidbody>();
        if (rigidbody != null)
        {
            rigidbody.constraints = RigidbodyConstraints.FreezeRotation;
        }
    }
그러나 상대방의 구성 요소를 보면 시비가 실행될 때 갑자기 외부에 설정이 바뀌어 무의식적인 행동을 할 수도 있다.
사용하는 곳은 연구가 필요하다고 할 수 있죠.

이외에 사용


원래 편집기 모드에서 실행할 수 있다면 아마도 할 수 있을 것이다.
    private void Reset()
    {
        // Add Componentしたと思ったらエディタが終了するトラップみたいなコンポーネント
        // !!!絶対やめましょう!!!
#if UNITY_EDITOR
        UnityEditor.EditorApplication.Exit(0);
#endif
    }

주의사항


및 편리한 Reset () 을 참조하십시오.
그것은 편집기 모드에서만 호출되는 것이다.
즉, 실행할 때 스크립트에서 AddComponent () 를 추가하면 호출되지 않습니다.
        gameObject.AddComponent<ResetTest>();   // ResetTest.Reset()は呼び出されない
이 경우 각 시퀀스 필드의 값은 선언된 값입니다(위의 ResetTest.cs 예시에서null(None) 또는 0f).
또한 참고로 원하는 경우 Reset () 를 직접 호출할 수 있습니다.
(public라면 클래스 밖에서도 호출할 수 있습니다)
        gameObject.AddComponent<ResetTest>().Reset();   // Reset()はpublicで定義
하지만 Reset () 은 어디에서나 자유롭게 호출할 수 있기 때문에
만약 다른 사람이 내부 값을 지우는 방법으로 착각하여 호출한다면, 그 다음에 검사기에서 설정한 설정을 복원한 상태에서 동작하면 오류가 발생할 수 있다는 것을 느끼지 못한 것도 아니다.
내가 보기에 검사기가 설정한 보조 범위 내에서 사용하는 것이 비교적 타당하다.

참고 자료

  • http://kan-kikuchi.hatenablog.com/entry/MonoBehaviour_Reset
  • https://qiita.com/JunShimura/items/6576eb63c19c2c9f0c0a
  • 좋은 웹페이지 즐겨찾기