【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.csusing 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 () 은 어디에서나 자유롭게 호출할 수 있기 때문에
만약 다른 사람이 내부 값을 지우는 방법으로 착각하여 호출한다면, 그 다음에 검사기에서 설정한 설정을 복원한 상태에서 동작하면 오류가 발생할 수 있다는 것을 느끼지 못한 것도 아니다.
내가 보기에 검사기가 설정한 보조 범위 내에서 사용하는 것이 비교적 타당하다.
참고 자료
https://docs.unity3d.com/ja/current/ScriptReference/MonoBehaviour.Reset.html
이것은 편집기에서 구성 요소를 초기화할 때 부르는 방법입니다.
구체적으로 검사기에서 구성 요소를 추가할 때
마우스 오른쪽 버튼이나 톱니바퀴 아이콘을 클릭하고 나타나는 메뉴에서 Reset을 선택하면 호출됩니다.
사용 방법
직렬 필드 값을 초기화하는 데 주로 사용됩니다.
그럼에도 불구하고 선언문에 값을 대입하면 구성 요소/Reset을 추가할 때 임의로 값을 설정합니다
충분하면 Reset () 을 준비할 필요가 없습니다. [SerializeField]
private int _testValue = 100; // 特に何もしなくてもResetしたら100に戻る
성명에 대입할 수 없는 값을 초기화하는 데 사용합니다
선언문에 대입할 수 없는 값을 기본값으로 설정하고 싶습니다. (그리고 검사기에서 임의로 변경할 수 있도록 하고 싶습니다.) 이럴 때 Reset () 의 등장입니다.
ResetTest.csusing 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 () 은 어디에서나 자유롭게 호출할 수 있기 때문에
만약 다른 사람이 내부 값을 지우는 방법으로 착각하여 호출한다면, 그 다음에 검사기에서 설정한 설정을 복원한 상태에서 동작하면 오류가 발생할 수 있다는 것을 느끼지 못한 것도 아니다.
내가 보기에 검사기가 설정한 보조 범위 내에서 사용하는 것이 비교적 타당하다.
참고 자료
[SerializeField]
private int _testValue = 100; // 特に何もしなくてもResetしたら100に戻る
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;
}
}
}
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 () 은 어디에서나 자유롭게 호출할 수 있기 때문에만약 다른 사람이 내부 값을 지우는 방법으로 착각하여 호출한다면, 그 다음에 검사기에서 설정한 설정을 복원한 상태에서 동작하면 오류가 발생할 수 있다는 것을 느끼지 못한 것도 아니다.
내가 보기에 검사기가 설정한 보조 범위 내에서 사용하는 것이 비교적 타당하다.
참고 자료
Reference
이 문제에 관하여(【Unity】MonoBehaviour.Reset() 사용 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/neusstudio/items/725a60b548320f430e2e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)