注:个人用的第三人称相机...
查看:MyComponent_PositionMachine虚拟位置电机
查看:MyComponent_RotationMachine虚拟旋转电机
查看:MyComponent_Vector3Constraint向量\欧拉角约束器
/// <summary>
/// 第三人称通用相机
/// </summary>
public class MyComponent_TpsCamera : MonoBehaviour {
public Transform Camera;//相机
public Transform Player;//更随物
public bool Activation_ObstacleCrossing = false;//障碍穿越激活
public bool Activation_Rotating=true;//旋转激活
public bool Activation_Distance=true;//拉近激活
public bool Reverse_Mouse_X = false;//x轴翻转
public bool Reverse_Mouse_Y = false;//y轴翻转
public bool Reverse_Mouse_ScrollWheel = false;//拉近翻转
/// <summary>
/// 相机位置电机
/// </summary>
public MyComponent_PositionMachine CameraPositionMachine;
/// <summary>
/// 相机旋转电机
/// </summary>
public MyComponent_RotationMachine CameraRotationMachine;
/// <summary>
/// 相机更随偏移
/// </summary>
public Vector3 FollowPlayer_offset = Vector3.up;
/// <summary>
/// 相机跟随电机
/// </summary>
public MyComponent_PositionMachine FollowPlayer_PositionMachine;
/// <summary>
/// 相机跟随约束器(可无)
/// </summary>
public MyComponent_Vector3Constraint FollowPlayer_PositionConstraint;
private float collision_distance = 1;//障碍穿越的检测射线延伸长度
private int LayerMask = 0;//障碍穿越的遮罩层
void Start () { //默认设置
if(CameraPositionMachine == null){
CameraPositionMachine = gameObject.AddComponent<MyComponent_PositionMachine>();
CameraPositionMachine.PositionMoveSpeed = 0.1f;
}
if(CameraRotationMachine == null){
CameraRotationMachine = gameObject.AddComponent<MyComponent_RotationMachine>();
CameraRotationMachine.RotationMoveSpeed = 0.02f;
}
if(FollowPlayer_PositionMachine == null){
FollowPlayer_PositionMachine =gameObject .AddComponent<MyComponent_PositionMachine>();
FollowPlayer_PositionMachine.PositionMoveSpeed = 0.1f;
}
if(CameraPositionMachine.PositionConstraint==null){
CameraPositionMachine.PositionConstraint = CameraPositionMachine.gameObject.AddComponent<MyComponent_Vector3Constraint>();
CameraPositionMachine.PositionConstraint.Limit_Vector3_Max = new Vector3(0,0,-1);
CameraPositionMachine.PositionConstraint.Limit_Vector3_Min = new Vector3(0,0,-10);
}
if(CameraRotationMachine.RotationConstraint==null){
CameraRotationMachine.RotationConstraint = CameraRotationMachine.gameObject.AddComponent<MyComponent_Vector3Constraint>();
CameraRotationMachine.RotationConstraint.Limit_Vector3_Max = new Vector3(80,0,0);
CameraRotationMachine.RotationConstraint.Limit_Vector3_Min = new Vector3(-80,0,0);
CameraRotationMachine.RotationConstraint.Constraint_Y = false;
}
}
//===[主要方法]========================================================================
/// <summary>
/// 激活障碍穿越
/// </summary>
/// <param name="collision_distance">检测延伸长度</param>
/// <param name="LayerMask">遮罩层</param>
public void Activation_Obstacle_Crossing(float collision_distance,int LayerMask){
this.collision_distance = collision_distance;
this.LayerMask = LayerMask;
Activation_ObstacleCrossing = true;
}
/// <summary>
/// 相机旋转控制
/// </summary>
/// <param name="x">相机x轴操控值</param>
/// <param name="y">相机y轴操控值</param>
public void TpsCameraRotating(float x ,float y){
x=(Reverse_Mouse_X)?-x:x;
y=((Reverse_Mouse_Y)?-y:y);
transform.localEulerAngles = CameraRotationMachine.Set_MachineActivation(Activation_Rotating).SetTarget_Controlled(x,y,0).Run_EulerAngle_SmoothDampAngle();
}
/// <summary>
/// 相机拉伸控制
/// </summary>
/// <param name="z">相机z轴拉伸操控值</param>
public void TpsCameraDistance(float z){
z=((Reverse_Mouse_ScrollWheel)?-z:z);
Camera.position = transform.TransformPoint(CameraPositionMachine.Set_MachineActivation(Activation_Distance).SetTarget_Controlled(0,0,z).Run_SmoothDampAngle());
Camera.LookAt(transform);
if(Activation_ObstacleCrossing)TpsCamera_Obstacle_crossing(collision_distance,LayerMask);//障碍穿越
}
//========================================
/// <summary>
/// 障碍穿越
/// </summary>
/// <param name="collision_distance">检测延伸长度</param>
/// <param name="LayerMask">遮罩层</param>
private void TpsCamera_Obstacle_crossing(float collision_distance,int LayerMask){
Camera.position = MyTool.Static.CameraMove.Obstacle_crossing(transform.position,Camera.position-transform.position,collision_distance,LayerMask);
}
//========================================
void Update () {
Vector3 PlayerPosition = Player.position+FollowPlayer_offset;//主角位置+跟随偏移
if(FollowPlayer_PositionConstraint!=null){//跟随约束判断
Vector3 offsetPosition = transform.position - PlayerPosition; //偏移向量计算
offsetPosition = FollowPlayer_PositionConstraint.Constraints_Vector3(offsetPosition);//约束计算
FollowPlayer_PositionMachine.Machine_Reset(offsetPosition + PlayerPosition);//电机位置重置
}
transform.position = FollowPlayer_PositionMachine.SetTarget_Position(PlayerPosition).Run_SmoothDampAngle();//相机跟随
}
}
使用例子:
public class MyTpsCameraControl : MonoBehaviour {
public float Mouse_XSpeed = 3;//鼠标X轴速度
public float Mouse_YSpeed = 3;//鼠标Y轴速度
public float Mouse_ScrollWheelSpeed = 3;//鼠标滚轮速度
public MyComponent_TpsCamera tpsCamera;//通用第三人称相机
private Vector3 cameraController;//操控变量
void Start () {//初始化设置
tpsCamera.CameraPositionMachine.Machine_Reset(new Vector3 (0,0,-3));//位置电机重置
tpsCamera.CameraRotationMachine.Machine_Reset(new Vector3(30,tpsCamera.Player.localEulerAngles.y,tpsCamera.Player.localEulerAngles.z));//旋转电机重置
tpsCamera.CameraRotationMachine.RotationConstraint.Constraint_Reset(new Vector3(-30,0,0),new Vector3(80,0,0));//旋转约束重置
tpsCamera.Activation_Obstacle_Crossing(1,~LayerMask.GetMask(Tags.player));//障碍穿越激活
//Cursor.lockState = CursorLockMode.Locked;//锁定隐藏鼠标
//Cursor.visible = true;//显示鼠标
}
void Update() {
//===【鼠标操控获取】====
tpsCamera.Activation_Rotating = Input.GetMouseButton(1); //判断激活旋转
cameraController.x = Input.GetAxis("Mouse X") * Mouse_XSpeed ;
cameraController.y = -Input.GetAxis("Mouse Y") * Mouse_YSpeed ;
cameraController.z = Input.GetAxis("Mouse ScrollWheel") * Mouse_ScrollWheelSpeed ;
//===【相机控制】====
tpsCamera.TpsCameraRotating(cameraController.y,cameraController.x); //旋转控制
tpsCamera.TpsCameraDistance(cameraController.z); //拉伸控制
}
}
扔上去直接运行...
默认电机为空时,自动创建的电机与约束器组件
移动延迟跟随:
旋转,旋转限制,拉近,拉近限制,障碍穿越: