Benim yöntemim çoğunlukla başkalarının verdiği çözümlere benziyor :) Oyunu, ekran boyutundan bağımsız kılmak için kullandığım yaklaşımı ayrıntılı olarak açıklamaya çalışacağım.
Ekran Yönü
Ekran yönüne bağlı olarak (Manzara veya Portre), kameranın sabit bir yükseklikte mi, yoksa sabit genişlikte mi ölçekleneceğini dikkate almanız gerekir. Çoğunlukla peyzaj odaklı oyunlar için sabit genişliği ve portre odaklı oyunlar için sabit yüksekliği seçiyorum.
Kamera ölçeklendirme
Tartışıldığı gibi, bu sabit yükseklik veya sabit genişlik olabilir.
Sabit Yükseklik : Oyunun dikey alanı her zaman ekran yüksekliğine uyacaktır. Ekran en boy oranı değiştikçe, ekranın soluna ve sağına eklenen fazladan boşluk olacaktır. Bunu uygulamak için hiçbir şeyi kodlamanız gerekmez, bu birlik kamerasının varsayılan davranışıdır.
Sabit Genişlik : Oyunun yatay alanı her zaman ekran genişliğine uyacaktır. Ekranın en boy oranı değiştikçe üste ve aşağıya fazladan boşluk eklenir. Bunu uygulamak için küçük bir kod parçası yazmanız gerekir. Daha sonra kod formu güncelleme işlevini kaldırdığınızdan ve uyanık duruma getirdiğinizden emin olun.
using UnityEngine;
[ExecuteInEditMode]
public class ScaleWidthCamera : MonoBehaviour {
public int targetWidth = 640;
public float pixelsToUnits = 100;
void Update() {
int height = Mathf.RoundToInt(targetWidth / (float)Screen.width * Screen.height);
camera.orthographicSize = height / pixelsToUnits / 2;
}
}
Editörde, görüntülemek istediğiniz dünya alanı alanını tanımlamak için targetWidth'i değiştirebilirsiniz. Bu kod aşağıdaki videoda 2D oyunlar için pek çok başka uygulama ile birlikte açıklanmıştır :)
Unite 2014 - 2D Birlikteki En İyi Uygulamalar
En Boy Oranı
En genişinden en darına doğru en boy oranı listelendikten sonra, android ve iOS için neredeyse tüm ekran boyutlarını kapsar
- 5: 4
- 4: 3
- 3: 2
- 16:10
- 16: 9
Genelde tüm bu ekran oranlarını oyun ekranının altında verilen sıraya göre ayarlıyorum, çünkü farklı ekran boyutlarını test ederken kullanışlıdır :)
Harcanabilir Alan
Bu, seçtiğiniz kamera ölçeklemesine bağlı olarak ekrana yanlara veya üste / aşağıya eklenen alandır.
Sabit yükseklik için tüm oyun elemanları tercihen en dar olan 16: 9 oranına sığmalıdır. Ve arka plan 5: 4 oranını kaplayana kadar uzamalıdır. Bu da oyununuzun asla yanlarda siyah şeritler bulunmamasını sağlar.
Sabit genişlik için hemen hemen aynıdır ancak burada elementler 5: 4 oranına sığmalı ve BG 16: 9'a kadar uzatmalıdır.
sınırlar
Bazen oyun alanı için mevcut tüm ekranı kullanmamız gerektiğinden, harcanabilir alan yaklaşımını kullanamayız.
Örneğin, gökten düşen paraları yakalamak, sabit yükseklikte bir portre oyunu düşünün. Bu konuda, oyuncuya mevcut ekran genişliği boyunca yatay hareket etme yeteneği vermemiz gerekiyor.
Bu nedenle, kameranın sınırlarının, dünyadaki kameranın sol, sağ, üst veya alt kısımlarının dünyadaki tam olarak nerede olduğunu bilmek için koordine etmesi gerekir.
Bu sınırları oyun oyunlarını veya UI'yı kameranın istediğiniz bir tarafına tutturmak için de kullanabiliriz.
Camera.ViewportToWorldPoint kullanarak sınırları alabiliriz. Viewport alanı normalleştirilir ve kameraya göre ayarlanır. Kameranın sol alt kısmı (0,0); sağ üst (1,1). Z konumu kameradaki dünya birimlerinde. 2D / ortografik için z önemli değil.
Vector3 leftBottom = camera.ViewportToWorldPoint(new Vector3(0, 0, camera.nearClipPlane));
Vector3 rightTop = camera.ViewportToWorldPoint(new Vector3(1, 1, camera.nearClipPlane));
float left = leftBottom.x;
float bottom = leftBottom.y;
float right = rightTop.x;
float top = rightTop.y;
UI
Kullanıcı arayüzü için, oyun elemanları için kullandığımız konseptleri uygulayabiliriz. Unity5 UI'nın tanıtılmasından ve NGUI gibi eklentilerin kullanılabilirliğinden sonra, bu pek sorun olmayacak :)