2016-04-12 7 views
1

Bir dizide gameobjects/images'i nasıl saklayabilirim, böylece "for döngüsü" ni, rengin rengini değiştirmek yerine görüntünün rengini değiştirerek kullanabilirim. farklı görüntüler için farklı renkler istediğiniz gibi görünüyorBir dizide gameobjects nasıl depolanır Unity3d

public Image clay, sand, loam, silt, siltyClay, siltyLoam, loamySand, sandyLoam, siltyClayLoam; 

public void imageColor(){ 
     sand.color = Color.green; 
     clay.color = Color.white; 
     loam.color = Color.white; 
     silt.color = Color.white; 
     siltyClay.color = Color.white; 
     siltyLoam.color = Color.white; 
     loamySand.color = Color.white; 
     sandyLoam.color = Color.white; 
     siltyClayLoam.color = Color.white; 
     mountTex = (Texture)Resources.Load("sand", typeof(Texture)); 
} 
+0

Renk ve Görüntü arasındaki ilişki nedir? sadece ilk yeşil ve diğeri beyaz, değil mi? – Valentin

+0

sadece görüntülerin rengi seçildiğinde yeşil renge dönecektir .. – Kohaku

+0

not, bir kural olarak ** Unity'de asla diziler kullanmayın **. 'List <>' seçeneğini kullanın. – Fattie

cevap

5

, bunu yapmanın en iyi yolu gibi yapardı, zaten sahip nasıl.

sen alamayacaksın tek bir şey vardır:

siz "bir şeyi vurgulamak" için, programlama pıtır hepsini kapatmak ve daha sonra sadece birini açmak istiyorum

.

Bu temel bir programlama hüner:

public Image clay, sand, loam, silt, siltyClay, 
    siltyLoam, loamySand, sandyLoam, siltyClayLoam; 

private void AllOff() 
    { 
    sand.color = Color.white; 
    clay.color = Color.white; 
    loam.color = Color.white; 
    silt.color = Color.white; 
    siltyClay.color = Color.white; 
    siltyLoam.color = Color.white; 
    loamySand.color = Color.white; 
    sandyLoam.color = Color.white; 
    siltyClayLoam.color = Color.white; 
    } 

public Highlight(Image x) 
    { 
    AllOff(); 
    x.color = Color.green; 
    } 

kullanmak ..

Highlight(silt); 

söz konusu dokuz ürün

, gerçekten, bir liste vardır - bu yüzden onları bu şekilde kullanmayın. diğer durumlarda bunu yapması gerektiğini

Not:

public Image[] images; 

Inspector'da sadece onları sürükleyebilir, deneyin ve görün

bu sadece, bir defada hepsini üzerinde çalışmak için.

foreach (Image i in images) 
    Debug.Log(i); 
+0

Vay! Bunu nasıl düşünmedim .. teşekkürler .. – Kohaku

+0

sağda, bir kitap olmalı "25 en ustaca yazılım mühendisliği hileci".En yetenekli doğal programcılar bile, bu deseni kendi başlarına düşünmezlerse, birileri onu işaret etmelidir. – Fattie

1

:

.. Unity3D kodumu C# kullanarak. Ör. Görüntüler ve renkleri birlikte gruplandırın.

public Image clay, sand, loam, silt, siltyClay, siltyLoam, loamySand, sandyLoam, siltyClayLoam; 

[System.Serializable] 
public class ImageColorPairs 
{ 
    public Image[] images {get;set; } /* associate Images */ 
    public Color targetColor { get; set; } /* ..with a target color */ 
} 

private ImageColorPairs[] pairs; //Declare here but initialize later. Can't initialize these objects (error: referencing non-static field..) 

public void InitializePairsOnce() 
{ 
    /* Make up array of Pairs here */ 
    pairs = new ImageColorPairs[] { 
     new ImageColorPairs() { images = new Image[] { sand }, targetColor = Color.green } , 
     new ImageColorPairs() { images = new Image[] { clay, loam, silt, siltyClay, siltyLoam, loamySand, sandyLoam, siltyClayLoam }, targetColor = Color.white } 
}; 
} 

public void ImageColor() 
{ 
    /* Now setting the colors is easy! :) */ 
    foreach (var pair in pairs) 
    { 
     foreach (var image in pair.images) 
     { 
      image.color = pair.targetColor; 
     } 
    } 
} 

Ayrıca daha sonra ayrı ayrı bir renk her görüntüyü ilişkilendirmek verecek bir kendi ImageTuple gibi daha temel veri strucutres kullanmak yapabilirsiniz. Ama orada sadece iki temel grubunuz var gibi görünüyor, bu yüzden bir dizi görüntü için bir rengi ilişkilendirmek daha az işe yarıyor.

böyle bir sınıf ile Tuhaftır

[System.Serializable] 
public class ImageTuple 
{ 
    public Image image; 
    public Color targetColor; 

    public ImageTuple(Image img, Color col) 
    { 
     image = img; 
     targetColor = col; 
    } 
} 
private ImageTuple[] imageTuples; 

public void InitializeTuplesOnce() 
{ 
    imageTuples = new ImageTuple[] 
    { 
     new ImageTuple(clay, Color.green), 
     new ImageTuple(sand, Color.white), 
     //.. the rest 
    }; 
} 

public void ImageColor() 
{ 
    foreach (var pair in imageTuples) 
    { 
     pair.image.color = pair.targetColor; 
    } 
} 
+0

İlk kodunuzu denedim ancak "UnityEngine.UI.Image []" türünde nesne başlatılamıyor. Bir koleksiyon başlatıcısı ile ".. yardım .. – Kohaku

+0

sanırım bir 'yeni()' – Fattie

+0

eksik Ayrıca bir alandan bir alana değişti, böylece brace başlatma kırdı, üzgünüm. Düzeltme. –