MyComponent_TpsCamera第三人称通用相机

注:个人用的第三人称相机...

查看: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);			//拉伸控制	
	}
}

扔上去直接运行...

默认电机为空时,自动创建的电机与约束器组件

移动延迟跟随:

旋转,旋转限制,拉近,拉近限制,障碍穿越:

猜你喜欢

转载自blog.csdn.net/qq_40346899/article/details/86539656