Prompt Detail:
以下是一个在Unity中使用C#编写的简单的摄像机与地面碰撞检测脚本,它可以检测到摄像机与地面的碰撞,并自动将摄像机的高度调整为离地面一定距离(即“跟随地面”)。
csharpusing UnityEngine;
public class CameraCollision : MonoBehaviour
{
public float minDistance = 1.0f;
public float maxDistance = 4.0f;
public float smooth = 10.0f;
private Vector3 dollyDir;
private float distance;
void Awake()
{
dollyDir = transform.localPosition.normalized;
distance = transform.localPosition.magnitude;
}
void Update()
{
Vector3 desiredCameraPos = transform.parent.TransformPoint(dollyDir * maxDistance);
RaycastHit hit;
if (Physics.Linecast(transform.parent.position, desiredCameraPos, out hit))
{
distance = Mathf.Clamp(hit.distance, minDistance, maxDistance);
}
else
{
distance = maxDistance;
}
transform.localPosition = Vector3.Lerp(transform.localPosition, dollyDir * distance, Time.deltaTime * smooth);
}
}
在这个脚本中,我们定义了三个公共变量:minDistance
,maxDistance
和smooth
。minDistance
是相机离地面的最小距离,maxDistance
是相机离地面的最大距离,smooth
是相机移动的平滑度。
在Awake()
函数中,我们获取相机的初始位置,并记录其距离。在Update()
函数中,我们计算出相机的期望位置(即在最大距离上),并使用Physics.Linecast()
函数来检测相机与地面之间是否存在任何障碍物。如果有,则将相机的距离设置为碰撞点与相机父级之间的距离,否则将其设置为最大距离。
最后,我们使用Vector3.Lerp()
函数将相机从其当前位置移动到其新位置,实现平滑的相机移动。
请注意,此脚本需要将摄像机对象作为子对象放置在另一个游戏对象下,以便能够在Update()
函数中使用transform.parent
来获取该游戏对象的位置。