相關場景布置:
一:
上圖中的物體是一個空物體,位置和player的位置是一致的意荤!
二:
相機是上圖空物體是子物體!
private void LateUpdate()
{
CameraHit();
}
Vector3 oringinalPos = new Vector3(0, 1.2f, -8);//相機的局部坐標
void CameraHit()
{
RaycastHit hit;
//從player的位置到相機位置加1長度單位的位置發(fā)射射線只锻,碰撞到就進入
if (Physics.Linecast(player.position + Vector3.up, cameraTran.position+ (-cameraTran.forward.normalized), out hit))
{
if (!hit.collider.gameObject.CompareTag(ConstantScript.strCameraTag))
{
//如果射線碰撞的不是相機玖像,那么就取得射線碰撞點到玩家的距離
float currentDistance = Vector3.Distance(hit.point, player.position);
//如果射線碰撞點小于玩家與相機本來的距離,就說明角色身后是有東西齐饮,為了避免穿墻捐寥,就把相機拉近
if (currentDistance < 8)
{
Vector3 offsetTemp = cameraTran.parent.InverseTransformPoint(hit.point) - cameraTran.localPosition;
cameraTran.localPosition += offsetTemp * fSmoothSpeed * Time.deltaTime;
}
}
}
else//如果沒有碰撞笤昨,且相機和player的距離小于8,則移回原來的wei'zhi
{
if (Vector3.Distance(player.position, cameraTran.position) < 8)
{
Vector3 offsetTemp = oringinalPos - cameraTran.localPosition;
cameraTran.localPosition += offsetTemp * fSmoothSpeed * Time.deltaTime;
if (Vector3.Distance(cameraTran.position, new Vector3(0, 1.2f, -8)) < 0.5f)
{
cameraTran.localPosition = oringinalPos;
}
}
}
//攝像機跟隨player與player保持相對位置偏移 (不重要握恳,和碰撞無關)
transform.position = offsetPosition + player.position;
}
關鍵函數(shù):
Physics.Linecast()咬腋;
示例中所用的重載為:
public static bool Linecast(Vector3 start, Vector3 end, out RaycastHit hitInfo);
start:射線的起點; end:射線的終點 睡互; hitinfo:射線返回的信息
返回值:bool根竿,表示是否有碰撞;