Prompt Title: unity c# 摄像机与地面碰撞的脚本

Created 1 year ago
Votes 0
Views 267 times
0

Prompt Detail:

以下是一个在Unity中使用C#编写的简单的摄像机与地面碰撞检测脚本,它可以检测到摄像机与地面的碰撞,并自动将摄像机的高度调整为离地面一定距离(即“跟随地面”)。

csharp
using 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); } }

在这个脚本中,我们定义了三个公共变量:minDistancemaxDistancesmoothminDistance是相机离地面的最小距离,maxDistance是相机离地面的最大距离,smooth是相机移动的平滑度。

Awake()函数中,我们获取相机的初始位置,并记录其距离。在Update()函数中,我们计算出相机的期望位置(即在最大距离上),并使用Physics.Linecast()函数来检测相机与地面之间是否存在任何障碍物。如果有,则将相机的距离设置为碰撞点与相机父级之间的距离,否则将其设置为最大距离。

最后,我们使用Vector3.Lerp()函数将相机从其当前位置移动到其新位置,实现平滑的相机移动。

请注意,此脚本需要将摄像机对象作为子对象放置在另一个游戏对象下,以便能够在Update()函数中使用transform.parent来获取该游戏对象的位置。

avatar
Colin·Ching
Shared 1 prompt
Created 1 year ago

Leave a Comment

Related Tag Prompts

0
0
0
0
AI Assists Coding.
1 year ago 2023-07-27 06:49:00 Abdul Samad