攝像機在后面移動Before——這是GameObject。
public Transform Before, Camera;
public static volatile bool IsMove = false;
private float Speed = 0f;
private void FixedUpdate() {
Speed = Rb.velocity.magnitude / 0.5f;
IsMove = 1 > Speed;
Camera.position = Vector3.Lerp(Camera.position, Before.position, (Speed <= 0 ? 11 : Speed) * Time.fixedDeltaTime);
}
一切正常,除了我不知道如何計算相機已經接近地塊的邊界并且不需要進一步移動它?
UPD:
我試著這樣做:
if (!Physics.Raycast(cam.ViewportPointToRay(new Vector3(1, 0, 0)), cam.farClipPlane, terrainLayer)) {
camera.position = new Vector3(oldPosition.x, camera.position.y, oldPosition.z);
print("Right");
} else if (!Physics.Raycast(cam.ViewportPointToRay(new Vector3(0, 1, 0)), cam.farClipPlane, terrainLayer)) {
camera.position = new Vector3(oldPosition.x, camera.position.y, oldPosition.z);
print("Left");
}
但是,正如您所見,有可能只有 2 面,但是對于上半部分和下半部分,它不會以任何方式起作用。
只有當它可以移動時,我才需要相機來移動它。
也就是說,如果我們將物件移動到右側:

然后我們可以沿著y軸移動,如果我們還沒有到達終點y。它需要自動作業。
uj5u.com熱心網友回復:
一個簡單的想法,用地形對相機的每個角落進行光線投射,如果失敗,則拒絕移動。
Camera cam;
Transform camera;
var oldPosition = cameraTransform.position;
cameraTransform.position = newPosition;
int terrainLayer = LayerMask.GetMask("Terrain");
if (!Physics.Raycast(cam.ViewportPointToRay(new Vector3(0, 0, 0)), cam.farClipPlane, terrainLayer))
camera.position = oldPosition ;
else if (!Physics.Raycast(cam.ViewportPointToRay(new Vector3(0, 1, 0)), cam.farClipPlane, terrainLayer))
camera.position = oldPosition ;
else if (!Physics.Raycast(cam.ViewportPointToRay(new Vector3(1, 0, 0)), cam.farClipPlane, terrainLayer))
camera.position = oldPosition ;
else if (!Physics.Raycast(cam.ViewportPointToRay(new Vector3(1, 1, 0)), cam.farClipPlane, terrainLayer))
camera.position = oldPosition ;
uj5u.com熱心網友回復:
添加新答案以回答更新的示例。
添加輔助方法以簡化代碼。
bool Raycast(float u, float v)
{
return Physics.Raycast(cam.ViewportPointToRay(new Vector3(u, v, 0)), cam.farClipPlane, terrainLayer);
}
仍然在 4 個角上投射光線。
int flag = 0;
if(Raycast(0, 1))
flag |= 8;
if(Raycast(0, 1))
flag |= 4;
if(Raycast(0, 1))
flag |= 2;
if(Raycast(0, 1))
flag |= 1;
現在我們檢查哪條邊在矩形之外,然后不要將相機朝那個方向移動。
var delta = newPosition - oldPosition;
if(flag > 0)
{
switch(flag)
{
case 5: //left
case 9: //right
delta.x = 0f;
break;
case 3: //up
case 10: //down
delta.y = 0f;
break;
default: //more than 1 edge
delta.x = delta.y = 0f;
break;
}
camera.position = oldPosition delta;
}
uj5u.com熱心網友回復:
我設法這樣做:
if (!Physics.Raycast(cam.ViewportPointToRay(new Vector3(1, 1, 0)), cam.farClipPlane, terrainLayer)) {
float x = Сamera.position.x;
if (x <= oldPosition.x) {
x = oldPosition.x;
}
Сamera.position = new Vector3(x, oldPosition.y, oldPosition.z);
} else if (!Physics.Raycast(cam.ViewportPointToRay(new Vector3(0, 0, 0)), cam.farClipPlane, terrainLayer)) {
float x = Сamera.position.x;
if (x >= oldPosition.x) {
x = oldPosition.x;
}
Сamera.position = new Vector3(x, oldPosition.y, oldPosition.z);
}
if (!Physics.Raycast(cam.ViewportPointToRay(new Vector3(1, 0, 0)), cam.farClipPlane, terrainLayer)) {
Сamera.position = new Vector3(oldPosition.x, oldPosition.y, Сamera.position.z);
} else if (!Physics.Raycast(cam.ViewportPointToRay(new Vector3(0, 1, 0)), cam.farClipPlane, terrainLayer)) {
Сamera.position = new Vector3(oldPosition.x, oldPosition.y, Сamera.position.z);
}
只是作業有點歪,有時后面有光Terrain,但有時是這樣,可能是因為物體的速度太快而突破了。
也許不是,我什至不知道它是什么。
我只是不知道該怎么做。
如果有更好、更可靠的選擇,我會很高興得到任何幫助,這樣相機就可以嚴格地沿著這條路走Terrain,不會走得更遠。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/410967.html
標籤:
上一篇:如何平滑地鉗制控制器輸入?
下一篇:Latex:兩行網址
