Unity3d'de nasıl anahat çizebilirim?


13

Ben keyfi yükseklik bir dikdörtgen vurgulamak çalışıyorum. Bunu yapmanın en kolay yolunun, dikdörtgeni özetleyen ayrı bir "kutu" gameobject oluşturmak olacağını düşündüm.

Dikdörtgenin dört noktasını özetlemek için bir MeshRenderer + Saydam Doku ve bir LineRenderer ile denedim. İkisi de çok tatmin edici değil.

resim açıklamasını buraya girin

(Satır oluşturucu ortada, ölçeklenmiş küp sağda)

Bunun için doğru yol nedir? Sol dikdörtgen gibi bir şey elde etmeye çalışıyorum - seçimimin dört noktasından sabit genişlikte basit bir çevre.

Yanıtlar:


9

Kullanın GUI.Box().

Yalnızca bir 2B dikdörtgene ihtiyacınız varsa, GUI gitmenin yoludur. Doku olarak basit bir dikdörtgen kullanarak yeni bir GUIStyle oluşturun (dikdörtgenin içi saydam olmalıdır), Borderdeğerini uzatılmayacak şekilde ayarlayın ve arayın GUI.Box(new Rect(...),"",myGuiStyle);.

Camera.WorldToScreenPointDünya koordinatlarında (örn. 3D) bir şeyi özetlemek istiyorsanız yöntemi kullanabilirsiniz , Unity'nin dünya koordinatlarında y'nin aşağıdan yukarıya ve GUI'de y'nin yukarıdan aşağıya gittiğini unutmayın.

Kod Örneği:

void OnGUI()
{
    //top left point of rectangle
    Vector3 boxPosHiLeftWorld = new Vector3(0.5f, 12, 0);
    //bottom right point of rectangle
    Vector3 boxPosLowRightWorld = new Vector3(1.5f, 0, 0);

    Vector3 boxPosHiLeftCamera = Camera.main.WorldToScreenPoint(boxPosHiLeftWorld);
    Vector3 boxPosLowRightCamera = Camera.main.WorldToScreenPoint(boxPosLowRightWorld);

    float width = boxPosHiLeftCamera.x - boxPosLowRightCamera.x;
    float height = boxPosHiLeftCamera.y - boxPosLowRightCamera.y;


     GUI.Box(new Rect(boxPosHiLeftCamera.x, Screen.Height - boxPosHiLeftCamera.y, width, height),"", highlightBox);
}

Yanılmıyorsam, GUI.Box () her zaman sahnedeki nesnelerin üstüne çizilir mi? Bir gameobject'in arkasında veya kısmen bir GUI öğesine sahip olmak mümkün müdür?
Raven Dreamer

Evet, GUI her zaman diğer nesnelerden sonra çizilir. GUI'nin üstünde ayrı bir kamera oluşturmak için kullanabileceğiniz bir kesmek var, ancak biraz hantal.
Nevermind

Bu cevap bana ihtiyacım olanı verdi, ama genel durumda bunu yapmanın daha iyi bir yolu olması umuduyla şimdilik açık tutuyorum.
Raven Dreamer

Kod ekleme düzenlemenizi kabul ettim ve içindeki GUI-y-baş aşağı hata düzeltildi.
Nevermind

1

Aşağıda gölgelendirici olmayan bir yaklaşım bulunmaktadır.

2d kutunuzu, her bir çizginin yalnızca bir boyutta gerildiği dört satırdan fazla olmayan bir şey olarak düşünün (diğer iki boyut, kenarın enine kesitidir). Bu, gerçek hayatta bir kutu inşa edecekseniz, hepsi aynı kesit boyutuna sahip değişken ahşap uzunluklarını birleştirdiğinizde olduğu gibidir.

Bunu göz önünde bulundurarak, örneğin BoxBuilderbir GameObject'e bağlandığında dört alt GameObjects oluşturan ve yöneten bir Bileşen tasarlayabilirsiniz . Her çocuk oyun nesnesi kutu kenarlarınızdan biridir ve sadece bir boyutta gerilmiş bir 3d küp olabilir. Bir ile widthve heightbelirlenen BoxBuilderseviyeye, dört çocuk kenarlarının konumu gerektiği ve düzgün olmayan bir ölçek hesaplayabilirsiniz. Bu bir sürü olacaktır pos.x=w/2, pos.y=h/2, ..., scale.x=h, scale.y=wvb sıralama kod.

Sadece 2 boyutlu istediğini düşünmeme rağmen, aynı fikrin gerekirse 3 boyutlu kutulara da uygulanabileceğini, BoxBuilderşimdi 12 alt kenar oluşturup yönetmesi gerektiğini, ancak yine de her bir kenarı tek bir yerel boyutta ölçeklendirdiğini unutmayın.


Çalışabilir, ancak WAY çok karmaşık.
Nevermind

Bunu bu şekilde yapmak zorunda olsaydım, sadece 4 satır oluşturucu kullanırdım ...
Raven Dreamer

Ancak bu derinliği düzgün bir şekilde işler.
DuckMaestro

1

Basit bir yol, iki Geçişli bir Gölgelendirici kullanmaktır: ilk Geçiş, nesneyi biraz ölçeklendirmek için tepe gölgelendiricisini kullanır ve piksel gölgelendiricisini, anahattın olmasını istediğiniz renkle eşleşen düz bir renge renklendirmek için kullanır ve ikinci Pass normal render işlemini yapar.


Ne demek istediğinizi daha iyi açıklamak için bir kod örneği verebilir misiniz?
Raven Dreamer

Bu yalnızca orijini geometrik merkezinde olan dışbükey nesneler (dikdörtgen gibi) için işe yarar.
rootlocus

1

Ben bir 3d küp için "inme" oluşturmak için gereken dışında bir anahat oluşturma aynı sorunu vardı ve bunu başka bir yerde çevrimiçi görmedim yapmak için yeni bir yol buldum.

Aşağıdaki resimde anahatları olan iki şekil vardır. Sağdaki, LineRenderer ile oluşturulmuş ve her zaman kullanıcıya dönük düz yüzler oluşturan bir küp. Yüzü oluşturan üçgenleri taklit eden rastgele "vuruşlar" görünerek, bu yöntemi süper glitchy buldum.

Soldaki, benim taslak gibi görünen 12 ayrı sıska küp içeren “inovasyonum”. Anahattaki “kontur” boyutunu değiştirmek için 12 sıska küpün her iki tarafının boyutlarını arttırmam / azaltmam gerekiyor. Bu aynı zamanda 2d anahatlar için de işe yarar. Sadece rengini ve rengini değiştirmek için bir malzeme uygulayın!

iki farklı ana hat

Bu görüntüde bu küpün yapısının bir detayını görebilirsiniz. Bu, çalışma zamanında oluşturulabilir, ancak elle yaptım ve bir prefabrik olarak kullandım.

detay


0

Şu anda aynı sorunla karşı karşıyayım ve çözümüm tam olarak DuckMaestro ve Raven Dreamer'ın önerdiği şey - Çalışma zamanında her birinin sınırın bir tarafını temsil eden ve her birine satır oluşturucuları ekleyen 4 alt nesne oluşturan bir komut dosyası var.

Benim durumumda, nesneyi (özel bir metin alanı için [kafes oluşturucu kullanan] bir metin ağı) tutmak için kenarlığı sürekli olarak yeniden boyutlandırmam gerekiyordu, böylece her güncelleme bunu yaptım:


float width = Mathf.Max(renderer.bounds.size.x + paddingX * 2, minWidth);      
float x = renderer.bounds.center.x - width / 2;
float height = renderer.bounds.size.y + paddingY * 2;
float y = renderer.bounds.center.y - height / 2;

AlterBorder(0, new Vector3(x - thickness / 2, y, 0), new Vector3(x + width + thickness / 2, y, 0)); //Bottom edge going left to right
AlterBorder(1, new Vector3(x + width, y + thickness / 2, 0), new Vector3(x + width, y + height - thickness / 2, 0)); //Right edge going bottom to top
AlterBorder(2, new Vector3(x + width + thickness / 2, y + height, 0), new Vector3(x - thickness / 2, y + height, 0)); //Top edge going right to left
AlterBorder(3, new Vector3(x, y + height - thickness / 2, 0), new Vector3(x, y + thickness / 2, 0)); //Left edge going top to bottom

AlterBorder() sadece uygun satır oluşturucuya erişir (ilk parametre ile belirtilir) ve sırasıyla başlangıç ​​ve bitişini birinci ve ikinci vektöre ayarlar.

rendererBoyut için referans olarak kullandığımı unutmayın , ancak x, y sol üst köşe olduğu sürece herhangi bir dikdörtgen kullanabilirsiniz.

Bunun gerçekten iyi çalıştığını söyleyebileceğimden, oyunda harika görünüyor çünkü sınırlanmış nesneyi 3 eksenin hepsinde kolayca hareket ettirebiliyorum (hatta döndürün ve çizgi oluşturucular her zaman kameraya baktığı için garip görünmüyor) ve uygulamak zor değil.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.