控制相机旋转、移动、缩放等功能
程序员文章站
2024-03-16 20:20:10
...
using UnityEngine;
using System.Collections;
public class rotation : MonoBehaviour {
public static bool Kongrotating = true;
//----------------- 初始参数 -----------------
//--旋转速度
private float xSpeed = 125.0f;
private float ySpeed = 60.0f;
//--缩放速度
private float wheelSpeed = 50;
//--移动速度
private float xMoveSpeed = 200;
private float yMoveSpeed = 200;
//--是否无限制放大,但仍旧会受移动限制所规定的范围
private bool IsYYFD = true;
//--镜头与中心点距离,在 IsYYFD 变量为 true 时有效
public static float JvLi;
//----------------- 移动限制 -----------------
//--是否允许移动相机
public static bool IsCanMove;
//--是否允许旋转相机
public static bool IsCanRotate;
//--是否允许缩放相机
public static bool IsCanZoom;
//--是否开启位置限制
private bool IsCheck;
//--缩放限制,最大,最小
private float MaxWheel = 300;
private float MinWheel = 8;
//--移动限制
//x轴最大值、最小值
private float xMaxMove = 94;
private float xMinMove = -94;
//y轴最大值、最小值
private float yMaxMove = 58;
private float yMinMove = 1;
//z轴最大值、最小值
private float zMaxMove = 44;
private float zMinMove = -44;
//中心点物体
public static Transform Tanks;
//缩放控制
private float distance;
//位置控制
private Vector3 position;
//角度控制
private Quaternion rotation1;
//相机动画控制:0停止;1旋转指定角度;2旋转到某个角度
static int Ani_Camera;
//旋转动画的角度
static float XAniAngle = 0f;
static float YAniAngle = 0f;
static float ZAniAngle = 0f;
//旋转动画的方向
static bool XFX;
static bool YFX;
static bool ZFX;
//是否强行跳转
static bool IsQXTZ = false;
//是否跟随事件移动
public static bool IsFollow = false;
//锁定物体名称
static string LockModName = "";
//旋转速度
static float XZSD = 1;
//----------------- 无需改动,中间变量 -----------------
//旋转角度(二维屏幕)
public static float x = 90.0f;
public static float y = 30.0f;
public static float z = 0.0f;
//坐标还原点
private Vector3 LPosition;
//中心物体坐标还原点
private Vector3 LTPosition;
//----------------- 公用函数 -----------------
//使相机跳转到模型
public static bool MoveToMod(string ModName)
{
if (ModName == null || ModName == "") return false;
//获得模型名称的GameObject
Transform newTran = GameObject.Find(ModName).transform;
//如果获取到了
if (newTran != null)
{
//设置相机位置
Tanks.position = newTran.position;
IsQXTZ = true;
//返回成功
return true;
}
//如果失败
else
{
//返回假
return false;
}
}
//使相机跳转到模型并按一定角度跳转
public static void CameraRotate(string ModName, float XAngle, float YAngle, float ZAngle, float Velocity, bool LsFollow)
{
//设置是否跟随视角
IsFollow = LsFollow;
//设置相机位置
LockModName = ModName;
//设置旋转角度
XAniAngle = XAngle;
YAniAngle = YAngle;
ZAniAngle = ZAngle;
//设置速度
XZSD = Velocity;
//初始化相机动画控制
Ani_Camera = 1;
}
//相机旋转到某个角度
public static void CameraRotateTo(string ModName, float XAngle, float YAngle, float ZAngle, float Velocity, bool LsFollow)
{
//throw new Exception(ModName);
//设置是否跟随视角
IsFollow = LsFollow;
//设置相机位置
LockModName = ModName;
//设置旋转角度
XAniAngle = XAngle;
YAniAngle = YAngle;
ZAniAngle = ZAngle;
//设置速度
XZSD = Velocity;
//定义偏移速度
XFX = (XAniAngle > x) ? true : false;
YFX = (YAniAngle > y) ? true : false;
ZFX = (ZAniAngle > z) ? true : false;
//开启动画控制
Ani_Camera = 2;
}
//停止旋转
public static void StopXZ()
{
Ani_Camera = 0;
}
//格式化X、Y、Z轴
public static void FormatXYZ()
{
y = y % 360;
x = x % 360;
z = z % 360;
//y = (360+y) % 360;
//x = (360+x) % 360;
//z = (360+z) % 360;
//if (y < 0) y = 360 + y;
//if (x < 0) x = 360 + x;
//if (z < 0) z = 360 + z;
}
//----------------- 系统函数 -----------------
void Start()
{
//初始化中心模块
Tanks = GameObject.Find("Main Camera").transform;
//初始化相机动画控制器
Ani_Camera = 0;
//初始化相机控制权,默认全部允许
IsCanMove = true;
IsCanRotate = true;
IsCanZoom = true;
//开启移动范围距离
IsCheck = true;
//关闭相机视角锁定
IsFollow = false;
//初始化相机位置
transform.position = new Vector3(-20.8f, 33.8f, 36.9f);
//初始化相机与中心模型的距离
JvLi = 30;
//初始化相机角度
x = 180; y = 45; z = 0;
//初始化中心物体位置
Tanks.position = new Vector3(-19.6f, 6.7f, 5.2f);
//初始化中心物体角度
Tanks.rotation = Quaternion.Euler(0, 0, 0);
//强制旋转
IsQXTZ = true;
}
void Update()
{
if (!Kongrotating) return;
//如果没有得到中心模块则此脚本无效
if (Tanks == null) return;
//初始坐标还原点
LPosition = transform.position;
//初始中心物体坐标还原点
LTPosition = Tanks.position;
if (IsFollow) MoveToMod(LockModName);
if (Input.GetKey(KeyCode.LeftArrow) || Input.GetKey(KeyCode.A))
{
x -= 2;
}
else if (Input.GetKey(KeyCode.RightArrow) || Input.GetKey(KeyCode.D))
{
x += 2;
}
if (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift))
{
y--;
}
else if (Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl))
{
y++;
}
if (Input.GetKey(KeyCode.UpArrow) || Input.GetKey(KeyCode.W))
{
transform.Translate(Vector3.forward * 30 * Time.deltaTime);
Tanks.Translate(Vector3.forward * 30 * Time.deltaTime);
}
else if (Input.GetKey(KeyCode.DownArrow) || Input.GetKey(KeyCode.S))
{
transform.Translate(Vector3.forward * -30 * Time.deltaTime);
Tanks.Translate(Vector3.forward * -30 * Time.deltaTime);
}
//旋转指定角度相机动画
if (Ani_Camera == 1)
{
//当还有剩余旋转角度则继续旋转
if (XAniAngle > 0)
{
//横向坐标加旋转速度
x += XZSD;
//剩余角度减去速度
XAniAngle -= XZSD;
}
if (YAniAngle > 0)
{
//横向坐标加旋转速度
y += XZSD;
//剩余角度减去速度
YAniAngle -= XZSD;
}
//如果没有剩余旋转角度
if (YAniAngle <= 0 && XAniAngle <= 0)
{
//设置强制跳转无效
IsQXTZ = false;
//关闭动画控制器
Ani_Camera = 0;
//取消跟踪
IsFollow = false;
}
}
//旋转到角度动画
else if (Ani_Camera == 2)
{
//检查是否完成
int IsCom = 0;
if (!XFX && XAniAngle < x - XZSD)
{
x -= XZSD;
}
else if (XFX && XAniAngle > x + XZSD)
{
x += XZSD;
}
else if ((!XFX && XAniAngle >= x - XZSD) || (XFX && XAniAngle <= x + XZSD))
{
IsCom++;
}
if (!YFX && YAniAngle < y - XZSD)
{
y -= XZSD;
}
else if (YFX && YAniAngle > y + XZSD)
{
y += XZSD;
}
else if ((!YFX && YAniAngle >= y - XZSD) || (YFX && YAniAngle <= y + XZSD))
{
IsCom++;
}
if (!ZFX && ZAniAngle < z - XZSD)
{
z -= XZSD;
}
else if (ZFX && ZAniAngle > z + XZSD)
{
z += XZSD;
}
else if ((!ZFX && ZAniAngle >= z - XZSD) || (ZFX && ZAniAngle <= z + XZSD))
{
IsCom++;
}
IsQXTZ = true;
if (IsCom >= 3)
{
//设置强制跳转无效
//IsQXTZ = false;
//关闭动画控制器
Ani_Camera = 0;
//关闭锁定模型
IsFollow = false;
}
}
//获取相机与模型的距离
distance = Vector3.Distance(transform.position, Tanks.position);
//检查相机是否是以无效放大的模式
if (IsYYFD)
{
//是则缩放时方快跟随移动
transform.Translate(Vector3.forward * Input.GetAxis("Mouse ScrollWheel") * wheelSpeed);
Tanks.Translate(Vector3.forward * Input.GetAxis("Mouse ScrollWheel") * wheelSpeed);
//方块与相机保持相应距离
distance = JvLi;
}
else
{
//限制缩放
if ((Input.GetAxis("Mouse ScrollWheel") < 0 || distance > MinWheel) && (Input.GetAxis("Mouse ScrollWheel") > 0 || distance < MaxWheel) || !IsCheck || IsQXTZ)
//如果允许缩放
if (IsCanZoom)
//缩放相机
distance -= Input.GetAxis("Mouse ScrollWheel") * wheelSpeed;
}
//按下鼠标右键执行旋转
if (Input.GetMouseButton(1) && IsCanRotate)
{
//设置横向旋转距离
x += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
//设置纵向旋转距离
y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
}
//格式化 x y z 坐标,使之不可超越-360~360
FormatXYZ();
//设置角度
rotation1 = Quaternion.Euler(y, x, z);
//设置位置
position = rotation1 * new Vector3(0.0f, 0.0f, -distance) + Tanks.position;
//更新角度
Tanks.rotation = rotation1;
//更新位置
if (Input.GetMouseButton(1) && IsCanRotate || IsQXTZ)
{
transform.position = position;
IsQXTZ = false;
}
else
{
transform.position = rotation1 * new Vector3(0.0f, 0.0f, 0.0f) + transform.position;
}
Tanks.position = rotation1 * new Vector3(0.0f, 0.0f, 0.0f) + Tanks.position;
//鼠标中间平移
if (Input.GetMouseButton(2) && IsCanMove)
{
//横向平移
transform.Translate(Vector3.right * xMoveSpeed * Time.deltaTime * -Input.GetAxis("Mouse X"));
//纵向平移,若相机垂直地面则向前平移
transform.Translate(Vector3.up * yMoveSpeed * Time.deltaTime * -Input.GetAxis("Mouse Y"));
//横向平移
Tanks.Translate(Vector3.right * xMoveSpeed * Time.deltaTime * -Input.GetAxis("Mouse X"));
//纵向平移,若相机垂直地面则向前平移
Tanks.Translate(Vector3.up * yMoveSpeed * Time.deltaTime * -Input.GetAxis("Mouse Y"));
}
//检查相机x轴
if ((transform.position.x > xMaxMove || transform.position.x < xMinMove) && IsCheck)
{
transform.position = new Vector3(LPosition.x, transform.position.y, transform.position.z);
}
//检查相机y轴
if ((transform.position.y > yMaxMove || transform.position.y < yMinMove) && IsCheck)
{
transform.position = new Vector3(transform.position.x, LPosition.y, transform.position.z);
}
//检查相机z轴
if ((transform.position.z > zMaxMove || transform.position.z < zMinMove) && IsCheck)
{
transform.position = new Vector3(transform.position.x, transform.position.y, LPosition.z);
}
//检查中心物体x轴
if ((Tanks.position.x > xMaxMove || Tanks.position.x < xMinMove) && IsCheck)
{
Tanks.position = new Vector3(LTPosition.x, Tanks.position.y, Tanks.position.z);
}
//检查中心物体y轴
if ((Tanks.position.y > yMaxMove || Tanks.position.y < yMinMove) && IsCheck)
{
Tanks.position = new Vector3(Tanks.position.x, LTPosition.y, Tanks.position.z);
}
//检查中心物体z轴
if ((Tanks.position.z > zMaxMove || Tanks.position.z < zMinMove) && IsCheck)
{
Tanks.position = new Vector3(Tanks.position.x, Tanks.position.y, LTPosition.z);
}
//更新角度
transform.rotation = Tanks.rotation;
}
}
下一篇: 求多边形面积