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(){}