天天看點

Unity擷取螢幕邊緣與檢測物體是否在視野内Unity擷取螢幕邊緣與檢測物體是否在視野内1. 需求描述

Unity擷取螢幕邊緣與檢測物體是否在視野内

1. 需求描述

當遊戲打包釋出時,需要解決目前市場上各式各樣螢幕比例的自适應問題。

UI方面隻要在編輯器中設定好就問題不大,主要是遊戲實體的縮放與生成和銷毀位置的問題。

需求如下:

  • 陸地塊的生成位置必須在螢幕外
  • 陸地塊的開始運動位置必須在螢幕右側邊緣
  • 陸地塊運動至螢幕外需要銷毀
  • 陸地塊右側邊緣位于螢幕右側邊緣時,需要啟動下一個陸地塊
  • 時間環無論在什麼螢幕下都應該充滿背景

3.3.4.2 代碼實作

想要實作如上需求,就必須要知道螢幕的邊緣在哪裡,也就是将螢幕的邊緣坐标從螢幕坐标轉化為世界坐标。可以通過如下代碼實作:

public float leftBorder;
public float rightBorder;
public float topBorder;
public float downBorder;
public float height;
public float width;
public Vector3 scale;
public void initBorder()
{
    //世界坐标的右上角  因為視口坐标右上角是1,1,點
    Vector3 cornerPos = Camera.main.ViewportToWorldPoint(new Vector3(1f, 1f,Mathf.Abs(-Camera.main.transform.position.z)));
    //世界坐标左邊界
    leftBorder = Camera.main.transform.position.x - (cornerPos.x - Camera.main.transform.position.x);
    //世界坐标右邊界
    rightBorder = cornerPos.x;
    //世界坐标上邊界
    topBorder = cornerPos.y;
    //世界坐标下邊界
    downBorder = Camera.main.transform.position.y - (cornerPos.y - Camera.main.transform.position.y);
    width = rightBorder - leftBorder;
    height = topBorder - downBorder;
    //在預設比例:16:9下的寬高
    float deffultH = 13.85643f;
    float deffultW = 24.60183f;
    //縮放求出比例
    scale = new Vector3(width/deffultW, height/deffultH, 0);
}
           

把上述代碼挂在到錄影機上,當錄影機就位後運作,就能得到:

  • 畫面四個邊界的世界坐标
  • 目前畫面比例下與預設畫面比例的縮放比

其中物體運作到視野外銷毀還可以使用另一種方法:

使用 OnBecameInvisible() 函數

//物體進入視野内觸發響應函數
public void OnBecameVisible(){}
//物體離開視野内觸發響應函數
public void OnBecameInvisible(){}