2015-07-26 7 views
0

Когда я создаю сборку как GameObject, проблем нет. Но при создании экземпляра prefab как RawImage существует проблема NullReferenceException. (Каркасный является RawImage, если вам нужно знать)Unity3D RawImage (UI) Instantiate

Это мой код:

using UnityEngine; 
using System.Collections; 
using UnityEngine.UI; 

public class Insstantia : MonoBehaviour 
{ 
    public GameObject img; 

    public void Instan() 
    { 
     RawImage[] myObject = new RawImage[8]; 
     RectTransform[] rt = new RectTransform[8]; 

     for (int i = 0; i < 8; i++) 
     { 
      myObject[i] = Instantiate(img, new Vector3(800 * i, 0, 0), Quaternion.identity) as RawImage; 
      rt[i] = myObject[i].GetComponent<RectTransform>(); 
      myObject[i].transform.SetParent(gameObject.transform, false); 

      rt[i].anchorMin = new Vector2(0.05875f, 0); 
      rt[i].anchorMax = new Vector2(0.94375f, 1); 
     } 
    } 
} 

ответ

2

Это потому, что вы бросаете ваш GameObject сборного к типу компоненты (RawImage), который возможен потому, что наследует тип компонента из типа объекта.

Так что, когда вы пытаетесь получить компонент, например, на этой линии:

rt[i] = myObject[i].GetComponent<RectTransform>(); 

NullReferenceExceptiion выбрасывается, потому что «IMG» геймобжекты был приведен к компонентным типа объекта и, следовательно, RectTransform компонент не существует ,

Попробуйте изменить общественные геймобжекты поля IMG для:

public RawImage img; 
+0

Сомневаюсь, что исправить проблему, экземпляр создает GameObject. RawImage - это компонент, прикрепленный к игровому объекту. Другой способ работы будет работать, когда вы измените myObject [] в GameObject, а не на RawImage. –

+0

Просто протестировал его, и, похоже, он работает, это, конечно же, путем изменения публичного поля на публичный RawImage img, а затем наложения на RawImage, что пытался сделать OP :) –

+0

Ему нужно будет изменить еще несколько призов, так как RectTransform не привязан к RawImage, но скорее скорее к экземпляру объекта –

1

Вашего вопрос в том, что вы пытаетесь преобразовать GameObject в Component. Команда instantiate создаст для вас GameObject, который в этом случае будет вашим сборником с прикрепленным к нему компонентом.

Чтобы устранить эту проблему, вам просто нужно сохранить GameObject вместо компонента, и если вам понадобится компонент RawImage, получите его так же, как ваш RectTransform.

public GameObject[] myObject = new GameObject[8]; 

вместо

public RawImage[] myObject = new RawImage[8]; 

(и не забудьте изменить вызов преобразования из as RawImage Для as GameObject)

Если вы имеете в виду на реальное изображение, а не компонент. Вы можете взглянуть на Resources.Load Вместо того, чтобы использовать Instantiate.

Смежные вопросы