Unity3D ile Minimap Yapımı

Fps ve Rts oyunlarındakine benzeyen bir karakteri takip eden bir unity minimap yapmaya çalışacağız. Haritayı test edebilmek için oyunumuza basit bir terrain ve küpten oluşan bir karakteri yapmakla işe başlayacağız.

1- Sahneye terrain ekliyorum ve cube nesnelerini ekliyorum. Zemin ve karakter olarak isimlendirdim. KarakterHareket isimli script açıp bunu karakter olarak kullanacağımız cube nesnesine bağlıyorum. Scriptin içeriği aşağıdaki gibi:

float hiz = 10f;

void Update()
{
   if (Input.GetKey(KeyCode.W))
      transform.Translate(Vector3.forward * Time.deltaTime * hiz);

   if (Input.GetKey(KeyCode.S))
      transform.Translate(-1 * Vector3.forward * Time.deltaTime * hiz);

   if (Input.GetKey(KeyCode.A))
      transform.Rotate(0, -1, 0);
   if (Input.GetKey(KeyCode.D))
      transform.Rotate(0, 1, 0);
}

2- İkinci olarak sahneye ikinci bir Camera ekleyip adını MinimapCamera olarak değiştiriyorum ve bu kameranın hiyerarşisini karakterin altına gelecek şekilde değiştiriyorum. Rotation kısmından x değerini 90 yaparak tam aşağı bakacak şekilde ayarladım. Kameramızın değerini Perspective -> Orthographic olarak değiştirdim böylece yakınlık/uzaklık unity minimap’e yansımayacak. Kamera üzerindeki size değerini varsayılan 5 olarak geliyor bunu yükseltebilirsiniz.
Projeyi bu şekilde çalıştırırsanız oyun ikinci kameradan görünecektir bu normal, biz bu kameranın görüntüsünü bir raw imageye aktaracağız.

  • Rotation x = 90,
  • Projection = Perspective -> Orthographic,
  • Size = 0

3- Sonraki adımda sahneye Minimap_ri adında bir UI -> Raw Image ekliyorum. Bu bizim minimap konumunu belirleyecek ben rts (real time strategy) oyunlarında genelde olduğu gibi sol alt köşeye alacağım tercih size kalmış canvası daha kolay düzenlemek için 2D moda geçilebilir.
Rect Transform’dan POS x/y değerlerini ayarlıyorum ve Anchor Preset’i sol alt köşeye hizalıyorum, boyutunu da 200 x 200 olarak değiştiriyorum.

  • Position = isteğe bağlı,
  • Rect Transform = konuma göre ayarlanmalı,
  • Width/Height = yine isteğe bağlı (ben 200 x 200 yaptım)

4- Projeye (canvas altına değil) “Render Texture” eklenir (Asset bölmesine sağ tıklayıp Create -> Render Textrure) ve adı MinimapRenderTexture olarak değiştirilir. Boyutunu önceki adımda eklediğim raw image (Minimap_ri) kadar yapılır. Depth Buffer özelliği “no depth buffer” olarak değiştirilir.

  • Depth Buffer = no depth buffer,
  • Size = Raw Image ile aynı (200 x 200)

5- Minimap Camera’ya dönülür ve “Target Texture” özelliğine önceki adımda oluşturduğumuz “MinimapRenderTexture” atanır. Böylece minimap camerası ekranı render etmekten vazgeçer ama raw imagemize görüntüyü yansıtmaz. Yansıtması için son yapılacak şey Minimap_ri isimli raw imagemizin texture özelliğine oluşturduğunuz MinimapRenderTexture atanır.\n\n\n\n

Minimap Camera için;

  • Target Texture = “MinimapRenderTexture”

Minimap_ri için;

  • Texture = MinimapRenderTexture

6- Kare o minimap camera görüntüsünü elde ettik. Border eklemek için Canvasın altına Image eklenir. “MinimapBorder_img” olarak ismi değiştirdim ve boyutunu 205 x 205 olarak ayarladım kenarlardan 5 birim border görünecek şekilde. Sonrada “Minimap_ri” nesnesinin parenti haline getirilir.
–> Bunu yapmadan önce dikkat etmeniz gereken şey minimapborderı önce boyutlandırmanız daha sonra parent haline getirmeniz gerekmektedir çünkü parent olarak boyutunu değiştirdiğinizde ikisi birden etkilenecektir. Anchor preset center yapılır.

  • Position = Minimap_ri nesnesinin üzerine gelecek şekilde,
  • Width/Height = 205 x 205 (Raw image nesnesinden 5 birim fazla),
  • Anchor Preset = Center

7- Minimap üzerinde kameranın karakterimizi takip etmesini iki farklı yöntemle yapabiliriz.

1- “MinimapCamera” yı Karakter alt nesnesi haline getirerek yapabiliriz ancak her zaman istenmeyebilir.
2- MinimapCamera’nın Karakteri’i LateUpdate içinde takip etmesini sağlayacak ufak bir kod yazabiliriz ki bunu kullanalım (Minimap cameraya script atanır ve üzerine Karakter nesnesi bağlanır).

public Transform Karakter;\n\n private void LateUpdate()\n {\n Vector3 NewPosition = Karakter.position;\n NewPosition.y = transform.position.y;\n transform.position = NewPosition;\n transform.rotation = Quaternion.Euler(90f, Karakter.eulerAngles.y, 0);\n }

KarakterTakip isimli C# scripti açarak bunu MinimapCamera’ya atamamız atadıktan sonra public değişkene Karakter nesnesini verdikten sonra kamera karakterimizi takip edecektir. Eğer minimap görüntüsünün daire şeklinde yapmak istiyorsanız unity mask kullanımı isimli yazıdan faydalanabilirsiniz. Aşağıda bazı ipucları bulabilirsiniz:

  • MinimapCamera’nın size özelliği ile minimap’ın yakınlık uzaklığı değiştirilebilir.
  • Kamerayı karakteri takip ederken rotate olur kaldırmak isterseniz koddaki transform.rotation = Quaternion.Euler(90f, Karakter.eulerAngles.y, 0); satırını yorum yapabilirsiniz.