2016-08-10 2 views
0

에게 내가 유니티의 새로운 스크립트를 만들 때마다 추가, 난 항상 내 스크립트처럼에 따라 구성 요소를 검사 한 무리의 일을 끝낼 수 있습니다 : 그래서유니티 : 일반적인 방법 가져 오거나 구성 요소

SpriteRenderer sr = gameObject.GetComponent<SpriteRenderer>(); 

if(sr == null) 
     sr = gameObject.AddComponent<SpriteRenderer>() as SpriteRenderer; 

을 모든 Component에서이 작업을 수행하기 위해 일반적인 방법을 사용하기로 결정하고 다음 코드를 작성했습니다.이 코드는 제 자신의 새 스크립트에 간단하게 추가했습니다. 이이 방법의 주요 단점은, 또는 같은 작업을 완료하는 데 다른 더 좋은 방법이 있다면, 아마도를 사용하는 경우

T GetOrAddComponent<T>() where T : Component 
    { 
     T component = gameObject.GetComponent<T>(); 

     if (component == null)  
      component = gameObject.AddComponent<T>() as T; 

     return component; 

    } 

나는 그것을 시도하고 기능이 잘 작동하지만 궁금하네요 기존 방법 나는 다른 방법으로 메서드를 만들거나 알지 못합니다. 당신은 잠재적으로 두 번 GetComponent 전화를 만드는 것입니다

SpriteRenderer sr; 

if(gameObject.GetComponent<SpriteRenderer>()) 
    sr = gameObject.GetComponent<SpriteRenderer>(); 
else 
    sr = gameObject.AddComponent<SpriteRenderer>() as SpriteRenderer; 

,하지만 당신은 코드 구조를 좋아하는 경우에 더 그렇게 될 :

+1

가 시작/깨어에서 작업을 수행하고 염려 할 필요가 없습니다. – Everts

+0

'return o.Get () ?? o.Add ()'(꽤'T'는 중복 됨) – SimpleVar

+0

이것은 모두 ECS 게임 엔진에 대해 매우 반 패턴입니다. – Fattie

답변

-2

당신은 문 당신이 원하는 경우 경우 하나에 모든 것을 할 수 있습니다. 나는 개인적으로 당신이하는 방식이 최선이라고 생각합니다. 당신이 장면 부하 또는 start 기능이 수행 될 때

더 간결하지만, 당신은 한 변수 component

public T GetOrAddComponent<T>() where T : Component 
{ 
    if (gameObject.GetComponent<T>()) 
     return gameObject.GetComponent<T>(); 
    else  
     return gameObject.AddComponent<T>() as T; 
} 

에 보관하고있는의 구성 요소를 대신 직접 반환 할 수 있습니다 성능 차이는 실제로 없을 것입니다.

+0

OP에 단일 호출이있는 동안 GetComponent의 이중 호출을 권장하는 이유는 무엇입니까? – Everts

+0

다른 접근 방식을 보여줍니다. –

2

GetComponent 메서드는 실제로 시스템에 부담이됩니다. 모바일 용으로 개발할 경우 너무 많은로드 시간에 눈에 띄는 지연이 발생할 수 있습니다.

저는 개인적으로 RequireComponent 메서드를 사용합니다. 그런 다음 스크립트는 GameObject에 추가 된 순간 자동으로 구성 요소를 추가합니다. 그런 다음 구성 요소의 이름을 inspector의 스크립트 객체 필드로 수동으로 드래그합니다.

예 :

using UnityEngine; 

// PlayerScript requires the GameObject to have a RigidBody component 
[RequireComponent (typeof (RigidBody))] 
public class PlayerScript : MonoBehavior { 
    [SerializeField] 
    private RigidBody rb; 
... 
} 
+0

필자는 Requirecomponent 메서드를 실제로 사용한 적이 없지만 이점을 잘 설명했습니다. 그것을 사용하고 난 후에는 단일 GetComponent 호출을 간단하게 만들 수 있으며 Component를 찾을 수 있다는 것을 보장하므로 AddComponent에 대한 검사 나 호출이 필요 없습니다. – user3476873

관련 문제