在本文疗隶,筆者將教你如何判斷一個(gè)3D世界游戲?qū)ο笤谄聊恢械目梢娦耘袛?2套方案)
1. 方案一
動(dòng)畫演示:
關(guān)鍵代碼:
using UnityEngine;
public class testcamera : MonoBehaviour
{
public GameObject ball;
void Update()
{
if (IsVisible(ball.GetComponent<Renderer>().bounds, Camera.main))
{
Debug.Log("可見");
}
else
{
Debug.Log("不可見");
}
}
public bool IsVisible(Bounds bounds, Camera camera)
{
// 得到攝像機(jī)的六個(gè)面
Plane[] planes = GeometryUtility.CalculateFrustumPlanes(camera);
// 判斷邊框bound是否在六個(gè)面內(nèi)
return GeometryUtility.TestPlanesAABB(planes, bounds);
}
}
下面代碼僅供移動(dòng)小球
using UnityEngine;
public class moveball : MonoBehaviour {
private void OnMouseDrag()
{
Vector3 v3 = Input.mousePosition;
v3.z = 4;
transform.position = Camera.main.ScreenToWorldPoint(v3);
}
}
2. 方案二
實(shí)現(xiàn)原理:
演示代碼:
using UnityEngine;
public class TestInvisable : MonoBehaviour {
private void OnBecameInvisible()
{
Debug.Log("不可見");
}
private void OnBecameVisible()
{
Debug.Log("可見");
}
}
演示動(dòng)畫:
測(cè)試小結(jié):
這兩個(gè)事件真的是搞事情啊茉继,很詭異,從演示來看:
- 游戲?qū)ο驟nable和Disable ,分別輸出可見和不可見葱跋;
- 在屏幕內(nèi),及時(shí)被其他物體遮擋源梭,依舊輸出可見娱俺;
- 在屏幕內(nèi),不管有沒被遮擋废麻,停止播放時(shí)輸出不可見荠卷;
- 在屏幕內(nèi),僅存該游戲?qū)ο髸r(shí)脑溢,Scene視角和Game視角共同均不可見時(shí)輸出不可見僵朗,反之亦然;
- 在屏幕內(nèi)屑彻,如果存在其他可能接受其陰影的游戲?qū)ο螅ㄆ┤绲孛妫r(shí)验庙,其Y軸將變成很大的值才被認(rèn)為不可見(動(dòng)畫演示中,在出現(xiàn)Cube后社牲,請(qǐng)密切關(guān)注transform組件Position.Y數(shù)值變化)
友情提示:這個(gè)小結(jié)呢粪薛,請(qǐng)親們結(jié)合動(dòng)畫體會(huì)哈。
3. 總結(jié):
- 記得哈搏恤,就算是游戲?qū)ο蟛豢梢娢ナ伲砩蠏燧d的邏輯依舊會(huì)執(zhí)行(想想這些輸出語(yǔ)句是怎么出來的) ;
- 學(xué)習(xí)筆記熟空,一切從簡(jiǎn)藤巢。