[Unity] 구성 요소의 초기화에서 Awake를 사용할지 아니면 자체 제작 방법을 사용할지, 예외적으로 발생할 때의 정지 방법은 다르다
예를 들어 Awake가 언제 불리었는지, 간단명료하게 측면과 구성 요소를 생성하는 데 의존하지 않을 수 있는 구조이다.
다른 한편, 제작 방법을 원한다면 매개 변수를 자유롭게 바꿀 수도 있고 유니티의 독특한 규격에 의존하지 않을 수도 있다.
Instantiate 및 AddComponent에 비해 성능이 크게 떨어지지 않습니다.
따라서 매개 변수가 같은 곳에서 부르지 않으면 스타일 이외에는 큰 차이가 없다.
내 생각엔.
견본
그 차이는 이상 처리에 있다.
다음 두 코드는 위에서 기술한 두 가지 패턴을 재현하는 조합이다.
모드 1(Awake로 초기화)
Manager.cspublic class Manager : MonoBehaviour {
// ゲーム開始時にキャラクターを生成する
void Awake() {
Debug.Log("パターン1(Awakeで初期化)");
var gameCharacter = new GameObject("GameCharacter");
gameCharacter.AddComponent<GameCharacter>();
Debug.Log("Game Start!");
}
}
GameCharacter.cspublic class GameCharacter : MonoBehaviour {
// だがそいつは初期化時にエラーを起こしてしまう死のキャラクターだった!
void Awake() {
Debug.Log("Initializing GameCharacter");
throw new System.Exception("GameCharacter: Initialization failed");
}
}
모드 2(Init 메서드로 초기화)
Manager.cspublic class Manager : MonoBehaviour {
// ゲーム開始時にキャラクターを生成する
void Awake() {
Debug.Log("パターン2(Initメソッドで初期化)");
var gameCharacter = new GameObject("GameCharacter");
gameCharacter.AddComponent<GameCharacter>().Init();
Debug.Log("Game Start!");
}
GameCharacter.cspublic class GameCharacter : MonoBehaviour {
// だがそいつは初期化時にエラーを起こしてしまう死のキャラクターだった!
public void Init() {
Debug.Log("Initializing GameCharacter");
throw new System.Exception("GameCharacter: Initialization failed");
}
}
결과
관리자를 구성할 때 1은 Game Start에 도달하고 2는 도착하지 않습니다.
검증
C#의 규격상 2가 있을 것이다.
즉 "1은 예외가 발생했을 텐데 멈추지 않았다"는 것이다.
유니티가 Awake라고 했을 때 뭘 하고 있었을 거야.
예를 들면 AddComponent입니다. 물론 Instantiate에서 Awake라고 불리는 것도 마찬가지입니다.
트리로 둘러봐봐.이 다른 부분은 아까와 같다.// パターン1 + try-catch
try {
var gameCharacter = new GameObject("GameCharacter");
gameCharacter.AddComponent<GameCharacter>();
} catch {
Debug.LogWarning("キャラクター生成できなかったけどいいよね?");
}
// パターン2 + try-catch
try {
var gameCharacter = new GameObject("GameCharacter");
gameCharacter.AddComponent<GameCharacter>().Init();
} catch {
Debug.LogWarning("キャラクター生成できなかったけどいいよね?");
}
전자는 예외를 포착할 수 없다.포위되지 않은 상태와 완전히 같다.
또한 로그와 창고 추적을 통해 알 수 있듯이 초기화는 실행을 지연시키는 것이 아니다.
이것은 "모든 소식이 처음부터 try-catch에 둘러싸여 있었다"는 것입니까? 아니면 같은 것입니까?
총결산
public class Manager : MonoBehaviour {
// ゲーム開始時にキャラクターを生成する
void Awake() {
Debug.Log("パターン1(Awakeで初期化)");
var gameCharacter = new GameObject("GameCharacter");
gameCharacter.AddComponent<GameCharacter>();
Debug.Log("Game Start!");
}
}
public class GameCharacter : MonoBehaviour {
// だがそいつは初期化時にエラーを起こしてしまう死のキャラクターだった!
void Awake() {
Debug.Log("Initializing GameCharacter");
throw new System.Exception("GameCharacter: Initialization failed");
}
}
public class Manager : MonoBehaviour {
// ゲーム開始時にキャラクターを生成する
void Awake() {
Debug.Log("パターン2(Initメソッドで初期化)");
var gameCharacter = new GameObject("GameCharacter");
gameCharacter.AddComponent<GameCharacter>().Init();
Debug.Log("Game Start!");
}
public class GameCharacter : MonoBehaviour {
// だがそいつは初期化時にエラーを起こしてしまう死のキャラクターだった!
public void Init() {
Debug.Log("Initializing GameCharacter");
throw new System.Exception("GameCharacter: Initialization failed");
}
}
C#의 규격상 2가 있을 것이다.
즉 "1은 예외가 발생했을 텐데 멈추지 않았다"는 것이다.
유니티가 Awake라고 했을 때 뭘 하고 있었을 거야.
예를 들면 AddComponent입니다. 물론 Instantiate에서 Awake라고 불리는 것도 마찬가지입니다.
트리로 둘러봐봐.이 다른 부분은 아까와 같다.
// パターン1 + try-catch
try {
var gameCharacter = new GameObject("GameCharacter");
gameCharacter.AddComponent<GameCharacter>();
} catch {
Debug.LogWarning("キャラクター生成できなかったけどいいよね?");
}
// パターン2 + try-catch
try {
var gameCharacter = new GameObject("GameCharacter");
gameCharacter.AddComponent<GameCharacter>().Init();
} catch {
Debug.LogWarning("キャラクター生成できなかったけどいいよね?");
}
전자는 예외를 포착할 수 없다.포위되지 않은 상태와 완전히 같다.
또한 로그와 창고 추적을 통해 알 수 있듯이 초기화는 실행을 지연시키는 것이 아니다.
이것은 "모든 소식이 처음부터 try-catch에 둘러싸여 있었다"는 것입니까? 아니면 같은 것입니까?
총결산
그럼에도 불구하고 Update처럼 PlayerLoop에서 호출된다는 소식은 당연히 이런 구조지만 Awake 등이 중간에 호출된 경우에도 마찬가지라는 것은 의외다.
Reference
이 문제에 관하여([Unity] 구성 요소의 초기화에서 Awake를 사용할지 아니면 자체 제작 방법을 사용할지, 예외적으로 발생할 때의 정지 방법은 다르다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kraihd/items/5f7430a304710b67b860텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)