Unity相机围绕物体旋转移动缩放

using DG.Tweening;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class CameraC : MonoBehaviour
{
public Transform targetModel;//目标模型
// 移动速度
public float speed = 20;
// 旋转距离
public float distance_v;
public float distance_h;
// 旋转速度
public float rotation_H_speed = 1;
public float rotation_V_speed = 1;
// 平移速度
public float move_H_speed = 1;
public float move_V_speed = 1;
public static float current_rotation_H; //水平旋转结果
public static float current_rotation_V; //垂直旋转结果
// 旋转限制
public static float maxUpAngle = 85;
public static float maxDownAngle = 5;
// 平移限制
public static float transMaxUp = 400;
public static float transMaxDown = 20;
// 缩放限制
public static float zoomMax = 400;
public static float zoomMin = 5;
public static float zoomSpeed = 15;
public static BaseModel selectModel;
[Logger]
private IWebLogger logger;
public static bool isRotation = false;
private Vector3 mForward;
private void Start()
{
current_rotation_H = transform.localEulerAngles.y;
current_rotation_V = transform.localEulerAngles.x;
}
// Update is called once per frame
void Update()
{
#region 按键移动
if (Input.GetKey(KeyCode.A)) //左移
{
transform.Translate(Vector3.left * speed * Time.deltaTime);
}
if (Input.GetKey(KeyCode.D)) //右移
{
transform.Translate(Vector3.right * speed * Time.deltaTime);
}
if (Input.GetKey(KeyCode.W)) //前移
{
transform.Translate(Vector3.forward * speed * Time.deltaTime);
}
if (Input.GetKey(KeyCode.S)) //后移
{
transform.Translate(Vector3.back * speed * Time.deltaTime);
}
if (Input.GetKey(KeyCode.Q)) //上移
{
transform.Translate(Vector3.up * speed * Time.deltaTime);
}
if (Input.GetKey(KeyCode.E)) //下移
{
transform.Translate(Vector3.down * speed * Time.deltaTime);
}
#endregion
// 缩放
if (Input.GetAxis("Mouse ScrollWheel") != 0)
{
//获取鼠标滚轮的滑动量
float wheel = Input.GetAxis("Mouse ScrollWheel") * Time.deltaTime * zoomSpeed;
//改变相机的位置
//Vector3 pos = Vector3.forward* wheel;
//float y = pos.y + transform.position.y;
//y = Mathf.Clamp(y, zoomMaxDown, zoomMaxUp);
//transform.position = new Vector3(transform.position.x, y, transform.position.z);
//this.transform.Translate(pos);
//print(Vector3.Distance(transform.position, targetModel.position));
if (Vector3.Distance(transform.position, targetModel.position) < zoomMin && wheel > 0) return;
if (Vector3.Distance(transform.position, targetModel.position) > zoomMax && wheel < 0) return;
mForward = targetModel.position - Camera.main.transform.position;
transform.position += mForward * wheel;
}
// F键聚焦当前物体
if (Input.GetKeyUp(KeyCode.F))
{
if (selectModel != null)
{
transform.LookAt(selectModel.transform);
}
}
}
private void LateUpdate()
{
// 点击 并获取点击物体
if (Input.GetMouseButtonUp(0))
{
// 前端 click() ---> 点击物体
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 2000))
{
Debug.DrawLine(ray.origin, hit.point, Color.red, 0.5f);
//Debug.Log(hit.point);
BaseModel baseModel = hit.collider.gameObject.GetComponent<BaseModel>();
if (baseModel != null)
{
selectModel = baseModel;
logger.Log("id:" + baseModel.Uuid + " prefabName:" + baseModel.BaseData.PrefabName +
" position:" + baseModel.BaseData.Transform.position +
" modelType:" + baseModel.modelType);
// 触发点击事件
if (!baseModel.BaseData.IsNoClick)
{
Sender sender = new Sender();
sender.eventName = BaseEvent.click;
sender.souce = gameObject;
EventCenter.Instance.TriggerEvent(BaseEvent.click, sender, baseModel.Uuid);
}
}
}
}
// 旋转
if (Input.GetMouseButton(1))
{
//控制旋转
//current_rotation_H += Input.GetAxis("Mouse X") * rotation_H_speed;
//current_rotation_V += Input.GetAxis("Mouse Y") * rotation_V_speed;
//current_rotation_V = Mathf.Clamp(current_rotation_V, maxDownAngle, maxUpAngle);
//transform.localEulerAngles = new Vector3(current_rotation_V, current_rotation_H, transform.localEulerAngles.z);
//transform.Translate(Vector3.back * distance_h, Space.Self);
//transform.Translate(Vector3.up * distance_v, Space.World); //相对于世界坐标y轴向上
var mouse_x = Input.GetAxis("Mouse X");//获取鼠标X轴移动
var mouse_y = -Input.GetAxis("Mouse Y");//获取鼠标Y轴移动
transform.RotateAround(targetModel.transform.position, Vector3.up, mouse_x * 5);
//transform.RotateAround(targetModel.transform.position, transform.right, mouse_y * 5);
//预设角度(当前角度加上将要增加/减少的角度)
float rotatedAngle = transform.eulerAngles.x + mouse_y * rotation_H_speed;
//旋转角度小于5则设置为5
if (rotatedAngle < maxDownAngle)
{
transform.RotateAround(targetModel.position, transform.right, (mouse_y * rotation_H_speed) + (maxDownAngle - rotatedAngle));
}
else if (rotatedAngle > maxUpAngle) //旋转角度大于85则设置85
{
transform.RotateAround(targetModel.position, transform.right, (mouse_y * rotation_H_speed) - (rotatedAngle - maxUpAngle));
}
else
{
transform.RotateAround(targetModel.position, transform.right, mouse_y * rotation_H_speed);
}
}
// 平移
if ( Input.GetMouseButton(0))
{
Vector3 pos = new Vector3(-Input.GetAxis("Mouse X") * move_H_speed, -Input.GetAxis("Mouse Y") * move_V_speed, 0f);
float y = pos.y + transform.position.y;
if (y > transMaxDown && y < transMaxUp)
{
this.transform.Translate(pos);
}
}
}
public float CheckAngle(float value)
{
float angle = value - 180;
if (angle > 0)
return angle - 180;
return angle + 180;
}
private 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);
}
}
posted @   Excel2016  阅读(592)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示