做项目的时候,需要控制摄像机需要围绕物体做360度旋转,考虑到有些人不会,为此这里就给大家准备了两种实现方式,希望能对大家有用。
第一种,使用Transform 函数 RotateAround。
代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Rotate : MonoBehaviour
{
public Transform target;//获取旋转目标
public float speed = 1;
private void camerarotate() //摄像机围绕目标旋转操作
{
transform.RotateAround(target.position, Vector3.up, speed * Time.deltaTime); //摄像机围绕目标旋转
var mouse_x = Input.GetAxis("Mouse X");//获取鼠标X轴移动
var mouse_y = -Input.GetAxis("Mouse Y");//获取鼠标Y轴移动
if (Input.GetKey(KeyCode.Mouse1))
{
transform.Translate(Vector3.left * (mouse_x * 15f) * Time.deltaTime);
transform.Translate(Vector3.up * (mouse_y * 15f) * Time.deltaTime);
}
if (Input.GetKey(KeyCode.Mouse0))
{
transform.RotateAround(target.transform.position, Vector3.up, mouse_x * 5);
transform.RotateAround(target.transform.position, transform.right, mouse_y * 5);
}
}
private void camerazoom() //摄像机滚轮缩放
{
if (Input.GetAxis("Mouse ScrollWheel") > 0)
transform.Translate(Vector3.forward * 0.5f);
if (Input.GetAxis("Mouse ScrollWheel") < 0)
transform.Translate(Vector3.forward * -0.5f);
}
private void Update()
{
camerarotate();
camerazoom();
}
}
二、如果出于某些特殊情况,比如被面试要求不允许使用RotateAround函数,或者非Unity平台等等。可以考虑使用四元数。
代码如下:
void MyRotateAround(Vector3 center, Vector3 axis, float angle)
{
Vector3 pos = transform.position;
Quaternion rot = Quaternion.AngleAxis(angle, axis);
Vector3 dir = pos - center; //计算从圆心指向摄像头的朝向向量
dir = rot * dir; //旋转此向量
transform.position = center + dir;//移动摄像机位置
var myrot = transform.rotation;
//transform.rotation *= Quaternion.Inverse(myrot) * rot *myrot;//设置角度另一种方法
transform.rotation = rot * myrot; //设置角度
}