2016-02-23 99 views
0

自一兩個月前開始使用Unity3D製作遊戲。我已經完成了我的第一款Android遊戲,它在我的手機(Samsung Galaxy S6)和仿真器上(Genymotion用不同的虛擬設備)完美地工作,但是當我在父親的手機上試用時(Nexus 5,Xperia Z1 & Z3 )我意識到它工作不好。各種設備的屏幕尺寸/比率災難

該遊戲是一個2D汽車交通賽車手,所以你必須躲避該產卵者在X軸上隨機位置創建的所有汽車。我不知道Unity3d太多,所以我不能更好地解釋它,對不起... :(

問題是,在我的手機上,敵方汽車從上到下產卵正確,但在我父親的手機上從sceen至底部中間產卵而當你移動你的車向左或向右,它看起來像切斜的另一個問題是

這是敵人的產卵的代碼:。

public class SpawnerEnemigos : MonoBehaviour { 

public GameObject[] cochesEnemigos; 
int cocheEnemigoID; 
public float maxPos = 2f; 
public float delayTimer = 0.5f; 
private float timer; 

// Use this for initialization 
void Start() { 
    timer = delayTimer; 
} 

// Update is called once per frame 
void Update() { 

    timer -= Time.deltaTime; 
    if (timer <= 0) { 
     Vector2 enemigoRandomPos = new Vector2 (Random.Range(-maxPos, maxPos), transform.position.y); 
     cocheEnemigoID = Random.Range(0,7); 
     Instantiate (cochesEnemigos[cocheEnemigoID], enemigoRandomPos, transform.rotation); 
     timer = delayTimer; 
    } 
} 

}

+2

請記住,遊戲不應該依賴手機屏幕尺寸。您可能硬編碼了一些適合您S6的屏幕分辨率的值,但不適用於其他手機。沒有附加代碼,人們不可能爲你提供更大的幫助。 – pleft

+1

除了上面提到的@elefasGR(這很可能是問題)之外,您的資產也可能無法正確確定其他屏幕密度的大小,導致它們在各種屏幕尺寸上的位置偏離。我要做的第一件事就是嘗試模仿你父親的手機,並匹配他們的確切屏幕尺寸和密度,然後從那裏開始使用你的代碼。 – NoChinDeluxe

+1

顯示你的代碼,你選擇隨機產生的位置。 – Buddy

回答

0

問題是,在我的手機上,敵方車輛從上到下產卵正確,但在我父親的手機上從屏幕中間產生到底部。

由於喬提到這可能是由於視口的差異。具有不同寬高比的設備,汽車出生點可能會根據屏幕而改變。

下面是關於如何使用視口來計算,其中在世界上的文檔您的對象將產生:Camera.ViewportToWorldPoint

// This is the part that we will be replacing. 
Vector2 enemigoRandomPos = new Vector2 (Random.Range(-maxPos, maxPos), transform.position.y); 

這是我將如何根據您所提供的代碼去了解它:

// Set the offset of the X axis first. This should be fairly similar for most devices, 
// if you find issues with it apply the same logic as the Y axis. 
var x = Random.Range(-maxPos, maxPos); 
// Here is where the magic happens, ViewportToWorldPoint converts a number between 0 and 1 to 
// an in-world number based on what the camera sees. In this specific situation I am telling it: to use 0f, 1f 
// which roughly translates to "At the top of the screen, on the left corner". Then storing the Y value of the call. 
var y = Camera.main.ViewportToWorldPoint(new Vector2(0f, 1f)).y; 
// Now that we have the x and y values, we can simply create the enemigoRandomPos based on them. 
var enemigoRandomPos = new Vector2(x, y); 

可以ofcourse刪除我所有的意見和在線整個事情,而不是:

var enemigoRandomPos = new Vector2(Random.Range(-maxPos, maxPos), Camera.main.ViewportToWorldPoint(new Vector2(0f, 1f)).y); 

幾件事情要記住:

  • Camera.main可以不定義,你需要找到攝像機的一個實例(這是這個問題的範圍之外,所以我會讓你谷歌爲此,如果你有問題,讓我知道,我會很樂意提供進一步的信息)
  • X位置可能會在一些縱橫比變得怪異,所以我建議你考慮也使用視口計算
  • 將這些值(Y和相機)存儲在開始方法上會更有效,並且只有在高寬比改變或相機更改時纔會更改它們。這對舊設備的性能會有所幫助。更多的家庭作業研究。 :)
  • 在對這類問題進行故障排除時,使用顯示問題的靜態小精靈(也就是不移動的東西)會很有幫助。我會在屏幕的所有角落+中心產生大約9個精靈,看看在調試過程中汽車從視覺輔助中產生的位置。
  • 問一個問題那就是圖形的性質可以幫助人們試圖給你的反饋很多,可以考慮加入一些當下次還提供了屏幕截圖:d

而另一個問題是當您將汽車向右或向左移動時,它看起來像對角切割。

基於這個描述,它聽起來像是汽車精靈和背景精靈三角形的某種裁剪問題。我建議根據相機的位置來回移動背景,以避免裁剪。