#region 点击物体移动
public Camera ca;
public GameObject DianjiObj;//点击到的物体
Ray ray;//射线
RaycastHit raycast;//射线返回的碰撞信息
Vector3 StarMousePos;//一开始鼠标的位置
Vector3 vector3;//要移动的距离
Vector3 EndV3;
#endregion
public Camera ca;
public GameObject DianjiObj;//点击到的物体
Ray ray;//射线
RaycastHit raycast;//射线返回的碰撞信息
Vector3 StarMousePos;//一开始鼠标的位置
Vector3 vector3;//要移动的距离
Vector3 EndV3;
#endregion
#region 绕着物体旋转
public Transform target;//声明一个观察目标 绕着这个物体旋转
//旋转角度
private float mx = 0.0f;
private float my = 0.0f;
//角度限制
private float MinLimitY = -180;
private float MaxLimitY = 180;
//旋转速度
public float SpeedX = 240;
public float SpeedY = 120;
public Transform target;//声明一个观察目标 绕着这个物体旋转
//旋转角度
private float mx = 0.0f;
private float my = 0.0f;
//角度限制
private float MinLimitY = -180;
private float MaxLimitY = 180;
//旋转速度
public float SpeedX = 240;
public float SpeedY = 120;
//储存角度
private Quaternion mRotation;
//是否使用平滑差值
public bool isNeedDamping = true;
//速度
public float DampingSpeed = 10F;
//摄像机到物体的观察距离
private float distance = 8f;
//缩放视野
public float minDistance = 2;
public float maxDistance = 30;
public float mSpeed = 10;
#endregion
private Quaternion mRotation;
//是否使用平滑差值
public bool isNeedDamping = true;
//速度
public float DampingSpeed = 10F;
//摄像机到物体的观察距离
private float distance = 8f;
//缩放视野
public float minDistance = 2;
public float maxDistance = 30;
public float mSpeed = 10;
#endregion
#region 鼠标拖动平移相机视野
public float MoveSpeed = 0.1f;
public float MoveSpeed = 0.1f;
#endregion
//鼠标枚举
private enum MouseButton
{
MouseButton_Lift=0,
MouseButton_Right=1,
MouseButton_Midle=2
}
//鼠标枚举
private enum MouseButton
{
MouseButton_Lift=0,
MouseButton_Right=1,
MouseButton_Midle=2
}
void Start ()
{
//获取鼠标一开始的位置
StarMousePos = Input.mousePosition;
mx = transform.eulerAngles.x;
my = transform.eulerAngles.y;
}
void Update ()
{
m_Move();
m_Rotate();
m_PingYI();
}
private void m_Move()//点击物体移动
{
if (Input.GetMouseButtonDown((int)MouseButton.MouseButton_Lift))
{
//把鼠标的世界坐标转化射线的屏幕发射位置
ray = ca.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray,out raycast))
{
DianjiObj = GameObject.Find(raycast.transform.name);
}
}
if (Input.GetMouseButton((int)MouseButton.MouseButton_Lift))
{
if (DianjiObj)
{
//获得物体的屏幕坐标
Vector3 ObjPingMu = Camera.main.WorldToScreenPoint(DianjiObj.transform.position);
//保存屏幕位置
Vector3 ObjMouse = new Vector3(Input.mousePosition.x,Input.mousePosition.y, ObjPingMu.z);
vector3 = Camera.main.ScreenToWorldPoint(ObjMouse) - DianjiObj.transform.position;
EndV3 = vector3 + DianjiObj.transform.position;
DianjiObj.transform.position = EndV3;
}
}
}
private void m_Rotate()//绕着物体旋转
{
if (target != null && Input.GetMouseButton((int)MouseButton.MouseButton_Right))
{
mx += Input.GetAxis("Mouse X") * SpeedX * 0.02f;
my -= Input.GetAxis("Mouse Y") * SpeedY * 0.02f;
my = ClampAngle(my, MinLimitY, MaxLimitY);
{
//获取鼠标一开始的位置
StarMousePos = Input.mousePosition;
mx = transform.eulerAngles.x;
my = transform.eulerAngles.y;
}
void Update ()
{
m_Move();
m_Rotate();
m_PingYI();
}
private void m_Move()//点击物体移动
{
if (Input.GetMouseButtonDown((int)MouseButton.MouseButton_Lift))
{
//把鼠标的世界坐标转化射线的屏幕发射位置
ray = ca.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray,out raycast))
{
DianjiObj = GameObject.Find(raycast.transform.name);
}
}
if (Input.GetMouseButton((int)MouseButton.MouseButton_Lift))
{
if (DianjiObj)
{
//获得物体的屏幕坐标
Vector3 ObjPingMu = Camera.main.WorldToScreenPoint(DianjiObj.transform.position);
//保存屏幕位置
Vector3 ObjMouse = new Vector3(Input.mousePosition.x,Input.mousePosition.y, ObjPingMu.z);
vector3 = Camera.main.ScreenToWorldPoint(ObjMouse) - DianjiObj.transform.position;
EndV3 = vector3 + DianjiObj.transform.position;
DianjiObj.transform.position = EndV3;
}
}
}
private void m_Rotate()//绕着物体旋转
{
if (target != null && Input.GetMouseButton((int)MouseButton.MouseButton_Right))
{
mx += Input.GetAxis("Mouse X") * SpeedX * 0.02f;
my -= Input.GetAxis("Mouse Y") * SpeedY * 0.02f;
my = ClampAngle(my, MinLimitY, MaxLimitY);
Quaternion rotateAngle = Quaternion.Euler(my, mx, 0);//摄像机偏转角度
Vector3 disVector = new Vector3(0.0f, 0.0f, -distance);
Vector3 position = rotateAngle * disVector + target.position;
////开始计算旋转
mRotation = Quaternion.Euler(my, mx, 0);
if (isNeedDamping)
{
transform.rotation = Quaternion.Lerp(transform.rotation, mRotation, Time.deltaTime * DampingSpeed);
transform.position = Vector3.Lerp(transform.position, position, Time.deltaTime * DampingSpeed);
}
else
{
transform.rotation = mRotation;
transform.position = position;
}
}
}
private void m_PingYI()
{
if(Input.GetAxis("Horizontal") != 0)
{
transform.Translate(Input.GetAxis("Horizontal") * MoveSpeed, 0, 0);
}
if (Input.GetAxis("Vertical") != 0)
{
transform.Translate(0, Input.GetAxis("Vertical") * MoveSpeed, 0);
}
}
private float ClampAngle(float angle, float min, float max)
{
if (angle < -360)
{
angle += 360;
}
if (angle > 360)
{
angle -= 360;
}
return Mathf.Clamp(angle,min,max);
}
mRotation = Quaternion.Euler(my, mx, 0);
if (isNeedDamping)
{
transform.rotation = Quaternion.Lerp(transform.rotation, mRotation, Time.deltaTime * DampingSpeed);
transform.position = Vector3.Lerp(transform.position, position, Time.deltaTime * DampingSpeed);
}
else
{
transform.rotation = mRotation;
transform.position = position;
}
}
}
private void m_PingYI()
{
if(Input.GetAxis("Horizontal") != 0)
{
transform.Translate(Input.GetAxis("Horizontal") * MoveSpeed, 0, 0);
}
if (Input.GetAxis("Vertical") != 0)
{
transform.Translate(0, Input.GetAxis("Vertical") * MoveSpeed, 0);
}
}
private float ClampAngle(float angle, float min, float max)
{
if (angle < -360)
{
angle += 360;
}
if (angle > 360)
{
angle -= 360;
}
return Mathf.Clamp(angle,min,max);
}