|
先来讲讲我们为何要实现这个功能。目前市面场上大部分游戏都会有的一个功能,比如王者荣耀就有英雄模型3D展示效果,我们可以通过手指滑动屏幕看到模型的每个方向,让玩家可以更加直观的感受这个英雄,那么我们要怎么实现这个效果呢?
当然实现这种效果的方法有很多种,这里我就说下我的方法。
1.首先在场景中新建一个相机,然后相机的配置如下图所示,其他参数根据自身需要,其中Target Texture 字段需要在Assets目录下新建一个Render Texture,然后把他拖进相机里。
这个操作的目的就是让模型可以展示在UI层上,最后我们把相机的Z轴坐标改成-10,相机的基本配置就弄好了。
2.现在我们就需要新建一个脚本来控制模型旋转以及缩放。检测拖动操作的话在LateUpdate里面操作,这样看起来拖动操作会比较平滑一点。废话不多说直接上代码吧
public class UIShowCameraModer : MonoBehaviour
{
public Transform model; //当前需要展示的模型
public float distance = 10.0f; //模型距离相机的距离
public float minDistance = 3f; //最小距离
public float maxDistance = 18f; //最大距离
public float x_Speed = 200.0f; //X轴方向的旋转速度
public float y_Speed = 200.0f; //Y轴方向的旋转速度
public float zoomSpeed = 1f; //缩放速度
public bool isAllowYTilt = true; //是否允许Y轴倾斜
public float minYLimit = -90f; //Y轴最小倾斜角度
public float maxYLimit = 90f; //Y轴最大倾斜角度
private float xPoint = 0.0f; //X轴坐标
private float yPoint = 0.0f; //Y轴坐标
private float xTargetPoint = 0f; //目标X轴坐标
private float yTargetPoint = 0f; //目标Y轴坐标
private float xVelocityPoint = 1f; //X水平轴坐标
private float yVelocityPoint = 1f; //Y水平轴坐标
private float zoomVelocity = 1f;
public Vector3 pivotOffset = Vector3.zero; //位置偏移
public float targetDistance;
private void Start()
{
xTargetPoint = xPoint = transform.eulerAngles.x; //赋值
yTargetPoint = yPoint = ClampAngle(angles.y, minYLimit , maxYLimit );
targetDistance = distance;
}
private void LateUpdate()
{
if (!model) return;
var scroll = Input.GetAxis("Mouse ScrollWheel");//获取鼠标滚轮值
//根据鼠标滚轮的方向来确定模型于相机的距离
if (scroll > 0.0f) targetDistance -= zoomSpeed;
else if (scroll < 0.0f)
targetDistance += zoomSpeed;
//使用这个数学函数可以限制最大最小距离
targetDistance = Mathf.Clamp(targetDistance, minDistance, maxDistance);
if (Input.GetMouseButton(0))
{
xTargetPoint += Input.GetAxis(&#34;Mouse X&#34;) * x_Speed * 0.025f;
if (isAllowYTilt ) //Y轴是否可以旋转
{
yTargetPoint -= Input.GetAxis(&#34;Mouse Y&#34;) * y_Speed * 0.025f;
yTargetPoint = ClampAngle(yTargetPoint , minYLimit , maxYLimit );
}
}
//Mathf.SmoothDampAngle函数可以起到一个缓冲作用,好处就是拖动旋转的时候可以更加平滑
xPoint = Mathf.SmoothDampAngle(xPoint , xTargetPoint , ref xVelocityPoint, 0.3f);
yPoint = isAllowYTilt ? Mathf.SmoothDampAngle(yPoint, yTargetPoint , ref yVelocityPoint, 0.3f) : yTargetPoint ;
//旋转角度设置
Quaternion rotation = Quaternion.Euler(yPoint, xPoint, 0);
distance = Mathf.SmoothDamp(distance, targetDistance, ref zoomVelocity, 0.4f);
Vector3 position = rotation * new Vector3(0.0f, 0.0f, -distance) + model.position + pivotOffset;
//坐标赋值
transform.position = position;
transform.rotation = rotation;
}
///获取旋转角度
private static float ClampAngle(float angle, float min, float max)
{
if (angle < -360) angle += 360;
if (angle > 360) angle -= 360;
return Mathf.Clamp(angle, min, max);
}
然后我们把需要展示的模型直接赋值给pivot就可以了,如果你当前的模型Z轴坐标是0的话 可能游戏场景展示的时候会出现两个模型 ,解决方法,把Z轴坐标改大一点,直到看不见了就可以了。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|