using UnityEngine;
public class xjxz : MonoBehaviour {
public Transform 目标模型;
public bool mousechange;
[Tooltip("x:最小;y:最大")]
public Vector2 距离范围 = new Vector2(0.1f, 5f);
[Range(0f, 1f)]
public float 距离滑动条值 = 0.5f;
public float 左右旋转速度 = 2f;
public float 上下旋转速度 = 2f;
[Tooltip("x:最小;y:最大")]
public Vector2 上下旋转限制 = new Vector2(-20f, 80f);
public float 移动延迟 = 4f;
public bool slidering;
#region MonoBehaviour
public void Start()
{
if (!目标模型)
{
目标模型 = new GameObject("目标模型").transform;
}
位置初始化();
Now距离滑动条值 = 距离滑动条值;
重置位置();
}
public float mouseX = 40f;
public float mouseY = -30f;
Vector2 oldPosition1;
Vector2 oldPosition2;
public float distance;
public float dragSpeed = 10;
private void Awake()
{
mouseX = -45f;
mouseY = 40f;
}
void Update()
{
distance = Get当前距离 ();
if (Input.GetKey(KeyCode.Y))
{
距离滑动条值 -= Time.deltaTime * 0.5f;
距离滑动条值 = Mathf.Clamp(距离滑动条值, 0, 1);
}
if (Input.GetKey(KeyCode.H))
{
距离滑动条值 += Time.deltaTime * 0.5f;
距离滑动条值 = Mathf.Clamp(距离滑动条值, 0, 1);
}
if (Input.GetMouseButton(1)&&!mousechange|| Input.GetMouseButton(0) && mousechange)
{
// transform.Translate(-Input.GetAxisRaw("Mouse X") * Time.deltaTime * dragSpeed, -Input.GetAxisRaw("Mouse Y") * Time.deltaTime * dragSpeed, 0);
Vector3 current= transform.TransformDirection(-Input.GetAxisRaw("Mouse X") * Time.deltaTime * dragSpeed, -Input.GetAxisRaw("Mouse Y") * Time.deltaTime * dragSpeed, 0);
目标模型.position += current;Debug.Log("U");
}
if (Input.GetKey(KeyCode.A))
{
mouseY += 0.8f;
}
if (Input.GetKey(KeyCode.D))
{
mouseY -= 0.8f;
}
if (Input.GetKey(KeyCode.X))
{
mouseX += 0.8f;
}
if (Input.GetKey(KeyCode.W))
{
mouseX -= 0.8f;
}
#if UNITY_EDITOR || UNITY_STANDALONE || UNITY_WEBPLAYER
if (Input.GetMouseButton(0))
{
mouseX += Input.GetAxis("Mouse X") * 左右旋转速度;
mouseY -= Input.GetAxis("Mouse Y") * 上下旋转速度;
}
else if (Input.GetAxis("Mouse ScrollWheel") != 0)
{
距离滑动条值 += Input.GetAxis("Mouse ScrollWheel") * 0.5f;
距离滑动条值 = Mathf.Clamp(距离滑动条值, 0, 1);
}
if (Input.touchCount == 1 && Input.GetTouch(0).phase == TouchPhase.Moved)
{
mouseX += Input.GetTouch(0).deltaPosition.x;
mouseY -= Input.GetTouch(0).deltaPosition.y;
}
else if (Input.touchCount > 1)
{
if (Input.GetTouch(0).phase == TouchPhase.Moved || Input.GetTouch(1).phase == TouchPhase.Moved)
{
var tempPosition1 = Input.GetTouch(0).position;
var tempPosition2 = Input.GetTouch(1).position;
if (isZoom(oldPosition1, oldPosition2, tempPosition1, tempPosition2))
{
if (距离滑动条值 > 0)
距离滑动条值 -= 0.05f;
}
else
{
if (距离滑动条值 < 1f)
距离滑动条值 += 0.05f;
}
oldPosition1 = tempPosition1;
oldPosition2 = tempPosition2;
}
}
#else
slidering = false;
if (Input.touchCount == 1&&!slidering)
{
if (Input.GetTouch(0).phase == TouchPhase.Moved)
{
mouseX += Input.GetAxis("Mouse X") * 左右旋转速度;
mouseY -= Input.GetAxis("Mouse Y") * 上下旋转速度;
}
}
else if (Input.touchCount > 1)
{
if (Input.GetTouch(0).phase == TouchPhase.Moved || Input.GetTouch(1).phase == TouchPhase.Moved)
{
var tempPosition1 = Input.GetTouch(0).position;
var tempPosition2 = Input.GetTouch(1).position;
if (isZoom(oldPosition1, oldPosition2, tempPosition1, tempPosition2))
{
if (距离滑动条值 > 0)
距离滑动条值 -= 0.05f;
}
else
{
if (距离滑动条值 < 1f)
距离滑动条值 += 0.05f;
}
oldPosition1 = tempPosition1;
oldPosition2 = tempPosition2;
}
}
#endif
}
void LateUpdate()
{
mouseY = ClampAngle(mouseY, 上下旋转限制.x, 上下旋转限制.y);
Quaternion toRotation = Quaternion.Euler(mouseY, mouseX, 0);
transform.rotation = Quaternion.Lerp(transform.rotation, toRotation, Time.deltaTime * 移动延迟);
if (目标模型 != null)
{
Vector3 toPosition = transform.rotation * new Vector3(0.0f, 0.0f, -Get当前距离()) + 目标模型.position;
transform.position = toPosition;
}
}
// void OnGUI()
// {
// if(GUI.Button(new Rect(10, 10, 200, 50), "重置位置"))
// {
// 重置位置();
// }
// }
#endregion
Vector3 StartAngles;
float Start距离滑动条值;
float Now距离滑动条值;
public void 位置初始化()
{
StartAngles = transform.eulerAngles;
Start距离滑动条值 = 距离滑动条值;
}
public void 重置位置()
{
mouseX = StartAngles.y;
mouseY = StartAngles.x;
距离滑动条值 = Start距离滑动条值;
}
public float Get当前距离()
{
Now距离滑动条值 = Mathf.Lerp(Now距离滑动条值, 距离滑动条值, Time.deltaTime * 移动延迟);
return 距离范围.x + (距离范围.y - 距离范围.x) * Now距离滑动条值;
}
#region Tools
///
/// 放大/缩小
///
///
///
///
///
///
bool isZoom(Vector2 oP1, Vector2 oP2, Vector2 nP1, Vector2 nP2)
{
float leng1 = Mathf.Sqrt((oP1.x - oP2.x) * (oP1.x - oP2.x) + (oP1.y - oP2.y) * (oP1.y - oP2.y));
float leng2 = Mathf.Sqrt((nP1.x - nP2.x) * (nP1.x - nP2.x) + (nP1.y - nP2.y) * (nP1.y - nP2.y));
if (leng1 > leng2)
return true;
else
return false;
}
///
/// 限制旋转最大/最小值
///
/// 当前
/// 最小
/// 最大
///
static float ClampAngle(float angle, float min, float max)
{
if (angle < -360)
angle += 360;
if (angle > 360)
angle -= 360;
return Mathf.Clamp(angle, min, max);
}
#endregion
}