最近 遇到 需要对整个城市 进行观看 控制,可以拖动城市地图,放大缩小,点击建筑拉近围绕查看 等等(并且所有操作只用鼠标控制)
老夫敲代码 ctrl+c ctrl+v,所有只能综合一下 多个大佬的代码 ,改改。
下面是控制相机,找的其他大神的相关代码
1.查看地图( 挂在 相机上)(忘记大佬的地址)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraMove : MonoSingleton_<CameraMove>
{
[Header("模型")]
public Transform targetmodel;
public static Transform target;
[Header("鼠标滚轮灵敏度")]
[SerializeField]
private int MouseWheelSensitivity = 2;
[Header("最近距离")]
[SerializeField]
public int MouseZoomMin = 750;
[Header("最远距离")]
[SerializeField]
public int MouseZoomMax =2000;
[Header("水平旋转速度")]
[SerializeField]
private float xSpeed = 250.0f;
[Header("竖直旋转速度")]
[SerializeField]
private float ySpeed = 120.0f;
[Header("鼠标移动灵敏度")]
[SerializeField]
private float mouseMoveSensitivity = 5.0f;
[Header("角度限制")]
[SerializeField]
private int yMinLimit = 0;
[SerializeField]
private int yMaxLimit = 89;
[Header("摄像机初始角度")]
[SerializeField]
private float xRot = 0;
[SerializeField]
private float yRot = 0;
[Header("摄像机位置")]
[SerializeField]
private Vector3 camPos;//= new Vector3(0, 0, 0);
public float normalDistance;//初始摄像机距离,无法在面板显示
//如果没有可以注释掉
//[Header("反射探针")]
//[SerializeField]
//private ReflectionProbe reflectionProbe;
//这里也要开放出来
//初始默认的角度,(y,x,0)
public static float x;//= 69f;
public static float y;// 34.2f;
private Vector3 normalized;
private Vector3 screenPoint;
private Vector3 offset;
private Quaternion rotation;
public static Vector3 CameraTarget;
public bool isExit = false;
public float YY;
void Start()
{
//初始化
YY = transform.position.y;
x = yRot;
y = xRot;
target = targetmodel;
//CameraTarget = target.position;
Vector3 posC = camPos - target.position;
Debug.Log(camPos);
normalDistance = Mathf.Sqrt(Mathf.Pow(posC.x, 2) + Mathf.Pow(posC.y, 2) + Mathf.Pow(posC.z, 2));
rotation = Quaternion.Euler(new Vector3(y, x, 0f));
transform.rotation = rotation;
float z = target.transform.position.z - normalDistance;
transform.position = camPos;//rotation * new Vector3(transform.position.x, transform.position.y, z);
CameraTarget = transform.position + transform.forward.normalized * normalDistance;
//transform.LookAt(target);
var angles = transform.eulerAngles;
x = angles.y;
y = angles.x;
}
void LateUpdate()
{
if (isExit)
{
if (Input.GetMouseButton(0))//鼠标左键
{
Vector3 p0 = Camera.main.transform.position;
Vector3 p01 = p0 - Camera.main.transform.right * Input.GetAxisRaw("Mouse X") * Time.timeScale * mouseMoveSensitivity;
Vector3 p03 = p01 - new Vector3(Camera.main.transform.forward.x, 0, Camera.main.transform.forward.z)
* Input.GetAxisRaw("Mouse Y") * Time.timeScale * mouseMoveSensitivity;
Camera.main.transform.position = p03;
//Debug.Log("方向" + Camera.main.transform.forward + ",投影:" + Camera.main.transform.forward * Mathf.Sqrt(1 - Mathf.Pow(Vector3.Dot(Camera.main.transform.forward, new Vector3(0, -1, 0)), 2)));
CameraTarget += (p03 - p0);
}
else if (Input.GetAxis("Mouse ScrollWheel") != 0)//鼠标滚轮
{
// normalized = (transform.position - CameraTarget).normalized;
if (normalDistance >= MouseZoomMin && normalDistance <= MouseZoomMax)
{
Camera.main.transform.position += Camera.main.transform.forward * Input.GetAxisRaw("Mouse ScrollWheel") * Time.timeScale * MouseWheelSensitivity;
Vector3 p = Camera.main.transform.position - CameraTarget;
normalDistance = Mathf.Sqrt(Mathf.Pow(p.x, 2) + Mathf.Pow(p.y, 2) + Mathf.Pow(p.z, 2));
}
if (normalDistance < MouseZoomMin)
{
normalDistance = MouseZoomMin;
}
if (normalDistance > MouseZoomMax)
{
normalDistance = MouseZoomMax;
}
if (transform.position.y<800)//限制 最小距离
{
transform.position = new Vector3(transform.position.x,800, transform.position.z);
}
if ( transform.position.y > 30000)//限制 最大距离
{
transform.position = new Vector3(transform.position.x, 30000, transform.position.z);
}
}
else if (Input.GetMouseButton(1))//鼠标右键
{
x += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
y = ClampAngle(y, yMinLimit, yMaxLimit);
var rotation = Quaternion.Euler(y, x, 0);
//var position = rotation * new Vector3(0.0f, 0.0f, -normalDistance) + CameraTarget;
transform.rotation = rotation;
//transform.position = position;//回到初始位置
}
//transform.LookAt(CameraTarget);
if (target.transform.position.y != 0)//
{
target.transform.position = new Vector3(target.transform.position.x, 0, target.transform.position.z);
}
反射探针,若无可以注释掉
//Vector3 pos = Camera.main.transform.position - target.position;
//Vector3 camPosition = Camera.main.transform.position;
应该和反射探针的位置关于水面对称 p.y - target.y = -pos.y;
//float y1 = Mathf.Abs(pos.y);
//ReflectionProbe pro = reflectionProbe.GetComponent<ReflectionProbe>();
//pro.size = new Vector3(pro.size.x, Mathf.Abs(y1) * 2 + 0.3f, pro.size.z);
//Vector3 currentpos = pos - new Vector3(0, y1, 0);
//reflectionProbe.transform.position = new Vector3(camPosition.x, camPosition.y - y1 * 2, camPosition.z);
//cube.position = CameraTarget;
}
}
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);
}
}
2.围绕物体 放大缩小
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//摄像机操作
//删减版 在实际的使用中可能会有限制的需求 比如最大远离多少 最近距离多少 不能旋转到地面以下等
public class CamCtrl : MonoBehaviour
{
public Transform CenObj;//围绕的物体
private Vector3 Rotion_Transform;
private new Camera camera;
void Start()
{
camera = GetComponent<Camera>();
Rotion_Transform = CenObj.position;
}
void Update()
{
Ctrl_Cam_Move();
Cam_Ctrl_Rotation();
}
//镜头的远离和接近
public void Ctrl_Cam_Move()
{
if (Input.GetAxis("Mouse ScrollWheel") > 0)
{
transform.Translate(Vector3.forward * 1f);//速度可调 自行调整
}
if (Input.GetAxis("Mouse ScrollWheel") < 0)
{
transform.Translate(Vector3.forward * -1f);//速度可调 自行调整
}
}
//摄像机的旋转
public void Cam_Ctrl_Rotation()
{
var mouse_x = Input.GetAxis("Mouse X");//获取鼠标X轴移动
var mouse_y = -Input.GetAxis("Mouse Y");//获取鼠标Y轴移动
if (Input.GetKey(KeyCode.Mouse1))
{
transform.RotateAround(Rotion_Transform, Vector3.up, mouse_x * 5);
transform.RotateAround(Rotion_Transform, transform.right, mouse_y * 5);
}
}
}
3.摄像机 定位 物体
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BaseCameraLookAtTarget : MonoBehaviour
{
public Transform mainCameraTr; //主摄像机
public Transform lookAtTarget; //摄像机看向的目标
public float cameraDistance = 6.0F; //摄像机与看向目标的距离
public float cameraHeight = 3.0F; //摄像机高度
public float cmaeraOffset = 1.0F; //摄像机的偏移
public float mainCameraMoveSpeed = 2F; //主摄像机移动的速度
public float waitTime = 0F; //等待摄像机移动到设备附近的时间
private Vector3 lookAtTargetPosition; //看向目标时的位置
private Quaternion lookAtTargetRotation; //看向目标,且旋转
public bool isLookAtAppointTarget = false; //是否看向指定的物体
public bool isBack = false;
private Vector3 mainCameraOriginalPosition; //主摄像机的原始位置
public IEnumerator Start()
{
yield return new WaitForSeconds(0.1f);
//记录主摄像机的原始位置
if (mainCameraTr != null)
{
mainCameraOriginalPosition = mainCameraTr.localPosition;
}
}
private void FixedUpdate()
{
if (isLookAtAppointTarget == true)
{
mainCameraTr.position = Vector3.Lerp(mainCameraTr.position, lookAtTargetPosition, Time.deltaTime * mainCameraMoveSpeed);
mainCameraTr.LookAt(lookAtTarget);
// StartCoroutine(Stop(waitTime));
}
if (isBack == true)
{
mainCameraTr.position = Vector3.Lerp(mainCameraTr.position, lookAtTargetPosition, Time.deltaTime * mainCameraMoveSpeed);
//StartCoroutine(Stop(waitTime));
}
}
/// <summary>
/// 摄像机看向指定物体的方法
/// </summary>
public void LookAtAppointTarget()
{
if (lookAtTarget != null)
{
lookAtTargetPosition = new Vector3(lookAtTarget.transform.position.x + cmaeraOffset, lookAtTarget.transform.position.y + cameraHeight, lookAtTarget.transform.position.z + cameraDistance);
isLookAtAppointTarget = true;
}
else
{
Debug.LogError(GetType() + "/LookAtAppointTarget()/看向的物体不存在,请检查!!!");
}
}
//摄像机返回原始位置
public void ReturnOriginalPosition()
{
lookAtTargetPosition = new Vector3(mainCameraOriginalPosition.x, mainCameraOriginalPosition.y, mainCameraOriginalPosition.z);
isBack = true;
}
IEnumerator Stop(float waitTime)
{
yield return new WaitForSeconds(waitTime);
if (isLookAtAppointTarget == true)
{
isLookAtAppointTarget = false;
}
if (isBack == true)
{
isBack = false;
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraLookAtControl : BaseCameraLookAtTarget
{
private void Start()
{
mainCameraTr = Camera.main.transform;
StartCoroutine(base.Start());
}
public void SetCameraLookAtObj(Transform cameraTr, Transform target)
{
mainCameraTr = cameraTr;
lookAtTarget = target;
LookAtAppointTarget();
}
}
4.我自己 改的 综合了一下 捉急用改的就不仔细, 将就用吧
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraMove : MonoSingleton_<CameraMove>
{
[Header("模型")]
public Transform targetmodel;
public static Transform target;
[Header("鼠标滚轮灵敏度")]
[SerializeField]
private int MouseWheelSensitivity = 2;
[Header("最近距离")]
[SerializeField]
public int MouseZoomMin = 750;
[Header("最远距离")]
[SerializeField]
public int MouseZoomMax = 2000;
[Header("水平旋转速度")]
[SerializeField]
private float xSpeed = 150.0f;
[Header("竖直旋转速度")]
[SerializeField]
private float ySpeed = 80.0f;
[Header("鼠标移动灵敏度")]
[SerializeField]
private float mouseMoveSensitivity = 3.0f;
[Header("角度限制")]
[SerializeField]
private int yMinLimit = 0;
[SerializeField]
private int yMaxLimit = 89;
[Header("摄像机初始角度")]
[SerializeField]
private float xRot = 0;
[SerializeField]
private float yRot = 0;
[Header("摄像机位置")]
[SerializeField]
private Vector3 camPos;//= new Vector3(0, 0, 0);
public float normalDistance;//初始摄像机距离,无法在面板显示
//如果没有可以注释掉
//[Header("反射探针")]
//[SerializeField]
//private ReflectionProbe reflectionProbe;
//这里也要开放出来
//初始默认的角度,(y,x,0)
public static float x;//= 69f;
public static float y;// 34.2f;
private Vector3 normalized;
private Vector3 screenPoint;
private Vector3 offset;
private Quaternion rotation;
public static Vector3 CameraTarget;
// [HideInInspector]
public bool isExit;
public bool isShuBiao;
void Start()
{
//初始化
isExit = true;
isShuBiao = true;
x = yRot;
y = xRot;
target = targetmodel;
//CameraTarget = target.position;
Vector3 posC = camPos - target.position;
Debug.Log(camPos);
normalDistance = Mathf.Sqrt(Mathf.Pow(posC.x, 2) + Mathf.Pow(posC.y, 2) + Mathf.Pow(posC.z, 2));
rotation = Quaternion.Euler(new Vector3(y, x, 0f));
transform.rotation = rotation;
float z = target.transform.position.z - normalDistance;
transform.position = camPos;//rotation * new Vector3(transform.position.x, transform.position.y, z);
CameraTarget = transform.position + transform.forward.normalized * normalDistance;
//transform.LookAt(target);
var angles = transform.eulerAngles;
x = angles.y;
y = angles.x;
//--------------------围绕的物体并且 相机定位物体------------//
mainCameraTr = this.transform;
camera = GetComponent<Camera>();
Rotion_Transform = CenObj.position;
// camera.transform.forward = (CenObj.localPosition - camera.transform.localPosition).normalized;
//bo = true;
}
void LateUpdate()
{
if (isExit)
{
if (isShuBiao)
{
if (Input.GetMouseButton(0))//鼠标左键
{
Vector3 p0 = Camera.main.transform.position;
Vector3 p01 = p0 - Camera.main.transform.right * Input.GetAxisRaw("Mouse X") * Time.timeScale * mouseMoveSensitivity;
Vector3 p03 = p01 - new Vector3(Camera.main.transform.forward.x, 0, Camera.main.transform.forward.z)
* Input.GetAxisRaw("Mouse Y") * Time.timeScale * mouseMoveSensitivity;
Camera.main.transform.position = p03;
CameraTarget += (p03 - p0);
}
else if (Input.GetAxis("Mouse ScrollWheel") != 0)//鼠标滚轮
{
// normalized = (transform.position - CameraTarget).normalized;
if (normalDistance >= MouseZoomMin && normalDistance <= MouseZoomMax)
{
Camera.main.transform.position += Camera.main.transform.forward * Input.GetAxisRaw("Mouse ScrollWheel") * Time.timeScale * MouseWheelSensitivity;
Vector3 p = Camera.main.transform.position - CameraTarget;
normalDistance = Mathf.Sqrt(Mathf.Pow(p.x, 2) + Mathf.Pow(p.y, 2) + Mathf.Pow(p.z, 2));
}
if (normalDistance < MouseZoomMin)
{
normalDistance = MouseZoomMin;
}
if (normalDistance > MouseZoomMax)
{
normalDistance = MouseZoomMax;
}
if (transform.position.y < 800)//限制 最小距离
{
transform.position = new Vector3(transform.position.x, 800, transform.position.z);
}
if (transform.position.y > 7000)//限制 最大距离
{
transform.position = new Vector3(transform.position.x, 7000, transform.position.z);
}
}
else if (Input.GetMouseButton(1))//鼠标右键
{
Debug.Log("x=" + x + " y=" + y);
y += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
x -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
x = ClampAngle(x, yMinLimit, yMaxLimit);
var rotation = Quaternion.Euler(x, y, 0);
//var position = rotation * new Vector3(0.0f, 0.0f, -normalDistance) + CameraTarget;
transform.rotation = rotation;
//transform.position = position;//回到初始位置
}
}
else
{
if (transform.position.y > 3000)//限制 最小距离
{
isShuBiao = true;
}
//缩放
if (Input.GetAxis("Mouse ScrollWheel") > 0)
{
transform.Translate(Vector3.forward * 100f);//速度可调 自行调整
}
if (Input.GetAxis("Mouse ScrollWheel") < 0)
{
transform.Translate(Vector3.forward * -100f);//速度可调 自行调整
}
//旋转
x = transform.localEulerAngles.x;//设置 角度,很重要
y = transform.localEulerAngles.y;
Debug.Log("xuanxuan x=" + transform.localEulerAngles.x + " y=" + y);
var mouse_x = Input.GetAxis("Mouse X") * xSpeed * 0.02f;//获取鼠标X轴移动
var mouse_y = -Input.GetAxis("Mouse Y") * ySpeed * 0.02f;//获取鼠标Y轴移动
if (Input.GetKey(KeyCode.Mouse1))
{
transform.RotateAround(Rotion_Transform, Vector3.up, mouse_x);
transform.RotateAround(Rotion_Transform, transform.right, mouse_y);
}
//Ctrl_Cam_Move();
//Cam_Ctrl_Rotation();
}
}
}
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);
}
//--------------------围绕的物体并且 相机定位物体------------//
public Transform CenObj;//围绕的物体
private Vector3 Rotion_Transform;
private new Camera camera;
//bool bo;
private Transform mainCameraTr; //主摄像机
public Transform lookAtTarget; //摄像机看向的目标
private float cameraDistance =50.0F; //摄像机与看向目标的距离
private float cameraHeight = 800.0F; //摄像机高度
private float cmaeraOffset = 1000.0F; //摄像机的偏移
private float mainCameraMoveSpeed = 1F; //主摄像机移动的速度
private Vector3 lookAtTargetPosition; //看向目标时的位置
private Quaternion lookAtTargetRotation; //看向目标,且旋转
public bool isLookAtAppointTarget = false; //是否看向指定的物体
public void SetInit(Transform CenObj_)
{
Debug.Log("点击了=" + CenObj_.name);
isShuBiao = true;
CenObj = CenObj_;
Rotion_Transform = CenObj.position;
lookAtTarget = CenObj_;
LookAtAppointTarget();
isShuBiao = false;
}
void Update()
{
//if (!isExit)
//{
// Ctrl_Cam_Move();
// Cam_Ctrl_Rotation();
//}
}
/// <summary>
/// 镜头的远离和接近
/// </summary>
public void Ctrl_Cam_Move()
{
if (Input.GetAxis("Mouse ScrollWheel") > 0)
{
transform.Translate(Vector3.forward * 100f);//速度可调 自行调整
}
if (Input.GetAxis("Mouse ScrollWheel") < 0)
{
transform.Translate(Vector3.forward * -100f);//速度可调 自行调整
}
}
/// <summary>
/// 摄像机的旋转
/// </summary>
public void Cam_Ctrl_Rotation()
{
var mouse_x = Input.GetAxis("Mouse X") * xSpeed * 0.02f;//获取鼠标X轴移动
var mouse_y = -Input.GetAxis("Mouse Y") * ySpeed * 0.02f;//获取鼠标Y轴移动
if (Input.GetKey(KeyCode.Mouse1))
{
transform.RotateAround(Rotion_Transform, Vector3.up, mouse_x * 5);
transform.RotateAround(Rotion_Transform, transform.right, mouse_y * 5);
}
}
/// <summary>
/// 摄像机看向指定物体的方法
/// </summary>
public void LookAtAppointTarget()
{
if (lookAtTarget != null)
{
lookAtTargetPosition = new Vector3(lookAtTarget.transform.position.x + cmaeraOffset,
lookAtTarget.transform.position.y + cameraHeight, lookAtTarget.transform.position.z + cameraDistance);
isLookAtAppointTarget = true;
}
else
{
Debug.LogError(GetType() + "/LookAtAppointTarget()/看向的物体不存在,请检查!!!");
}
if (isLookAtAppointTarget == true)//是否看向物体
{
mainCameraTr.position = Vector3.Lerp(mainCameraTr.position, lookAtTargetPosition, 1 * mainCameraMoveSpeed);
mainCameraTr.LookAt(lookAtTarget);
}
//if (isBack == true)
//{
// mainCameraTr.position = Vector3.Lerp(mainCameraTr.position, lookAtTargetPosition, 10 * mainCameraMoveSpeed);
//}
}
}
//相机围绕 物体查看
using UnityEngine;
using QFramework;
using Scripts;
using System;
using System.Collections.Generic;
using InterFuncitions;
/// <summary>
/// 该脚本需要挂在摄像机上
/// </summary>
public class CameraController : MonoBehaviour
{
public Transform targetObject;
public Vector3 targetOffset;
public float averageDistance = 5.0f;//初始位置 镜头远近
public float maxDistance = 20;
public float minDistance = .6f;
public float xSpeed = 200.0f;
public float ySpeed = 200.0f;
public int yMinLimit = -80;
public int yMaxLimit = 80;
public int xMinLimit = -80;
public int xMaxLimit = 80;
public int zoomSpeed = 40;
public float panSpeed = 0.3f;
public float zoomDampening = 5.0f;
public float rotateOnOff = 1;
private float xDeg = 0.0f;
private float yDeg = 0.0f;
private float currentDistance;
private float desiredDistance;
private Quaternion currentRotation;
private Quaternion desiredRotation;
private Quaternion rotation;
private Vector3 position;
private float idleTimer = 0.0f;
private float idleSmooth = 0.0f;
void Start() { Init(); }
void OnEnable() { Init(); }
public void Init()
{
tt();
}
public void tt()
{
if (!targetObject)
{
GameObject go = new GameObject("Cam Target");
go.transform.position = transform.position + (transform.forward * averageDistance);
targetObject = go.transform;
}
currentDistance = averageDistance;
desiredDistance = averageDistance;
position = transform.position;
rotation = transform.rotation;
currentRotation = transform.rotation;
desiredRotation = transform.rotation;
xDeg = Vector3.Angle(Vector3.right, transform.right);
yDeg = Vector3.Angle(Vector3.up, transform.up);
position = targetObject.position - (rotation * Vector3.forward * currentDistance + targetOffset);
}
void LateUpdate()
{
if (Input.GetMouseButton(2) && Input.GetKey(KeyCode.LeftAlt) && Input.GetKey(KeyCode.LeftControl))
{
desiredDistance -= Input.GetAxis("Mouse Y") * 0.02f * zoomSpeed * 0.125f * Mathf.Abs(desiredDistance);
}
else if (Input.GetMouseButton(0))
{
xDeg += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
yDeg -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
yDeg = ClampAngle(yDeg, yMinLimit, yMaxLimit);
xDeg = ClampAngle(xDeg, xMinLimit, xMaxLimit);
desiredRotation = Quaternion.Euler(yDeg, xDeg, 0);
currentRotation = transform.rotation;
rotation = Quaternion.Lerp(currentRotation, desiredRotation, 0.02f * zoomDampening);
transform.rotation = rotation;
idleTimer = 0;
idleSmooth = 0;
}
else
{
//自动旋转
//idleTimer += 0.02f;
//if (idleTimer > rotateOnOff && rotateOnOff > 0)
//{
// idleSmooth += (0.02f + idleSmooth) * 0.005f;
// idleSmooth = Mathf.Clamp(idleSmooth, 0, 1);
// xDeg += xSpeed * 0.001f * idleSmooth;
//}
//yDeg = ClampAngle(yDeg, yMinLimit, yMaxLimit);
//desiredRotation = Quaternion.Euler(yDeg, xDeg, 0);
//currentRotation = transform.rotation;
//rotation = Quaternion.Lerp(currentRotation, desiredRotation, 0.02f * zoomDampening * 2);
//transform.rotation = rotation;
}
desiredDistance -= Input.GetAxis("Mouse ScrollWheel") * 0.02f * zoomSpeed * Mathf.Abs(desiredDistance);
desiredDistance = Mathf.Clamp(desiredDistance, minDistance, maxDistance);
currentDistance = Mathf.Lerp(currentDistance, desiredDistance, 0.02f * zoomDampening);
position = targetObject.position - (rotation * Vector3.forward * currentDistance + targetOffset);
transform.position = position;
}
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);
}
}
Unity 键盘WASD 实现物体移动
1.将脚本挂在Capsule物体下,WASD 控制移动方向,滑动鼠标滚轮 向上移动,向下移动
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MoveCam : MonoBehaviour
{
private Vector3 m_camRot;
public Transform m_camTransform;//摄像机Transform
private Transform m_transform;//摄像机父物体Transform
public float m_movSpeed = 10;//移动系数
public float m_rotateSpeed = 1;//旋转系数
private void Start()
{
// m_camTransform = Camera.main.transform;
m_transform = GetComponent<Transform>();
}
private void Update()
{
Control();
}
void Control()
{
if (Input.GetMouseButton(1))
{
//获取鼠标移动距离
float rh = Input.GetAxis("Mouse X");
float rv = Input.GetAxis("Mouse Y");
// 旋转摄像机
m_camRot.x -= rv * m_rotateSpeed;
m_camRot.y += rh * m_rotateSpeed;
}
m_camTransform.eulerAngles = m_camRot;
// 使主角的面向方向与摄像机一致
Vector3 camrot = m_camTransform.eulerAngles;
camrot.x = 0; camrot.z = 0;
m_transform.eulerAngles = camrot;
// 定义3个值控制移动
float xm = 0, ym = 0, zm = 0;
//按键盘W向上移动
if (Input.GetKey(KeyCode.W))
{
zm += m_movSpeed * Time.deltaTime;
}
else if (Input.GetKey(KeyCode.S))//按键盘S向下移动
{
zm -= m_movSpeed * Time.deltaTime;
}
if (Input.GetKey(KeyCode.A))//按键盘A向左移动
{
xm -= m_movSpeed * Time.deltaTime;
}
else if (Input.GetKey(KeyCode.D))//按键盘D向右移动
{
xm += m_movSpeed * Time.deltaTime;
}
if (Input.GetAxis("Mouse ScrollWheel") > 0 && m_transform.position.y <= 1500)
{
ym += m_movSpeed * Time.deltaTime;
}
if (Input.GetAxis("Mouse ScrollWheel") < 0 && m_transform.position.y >= 100)
{
ym -= m_movSpeed * Time.deltaTime;
}
m_transform.Translate(new Vector3(xm, ym, zm), Space.Self);
}
}
2.WASD 控制移动方向,滑动鼠标滚轮 向上移动,向下移动
/**********************************************************************
文件信息
文件名(File Name): CameraController03.cs
作者(Author): TianWenQuan
创建时间(CreateTime): #CREATETIME#
Unity版本(UnityVersion): #UNITYVERSION#
项目:三峡库区消落带植物群落组成及其对水位变化的响应虚拟仿真实验
**********************************************************************/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
namespace Twq
{
public class CameraController03 : MonoBehaviour
{
public static CameraController03 Instance;
[Header("模型")]
public Transform targetmodel;
public static Transform target;
[Header("鼠标滚轮灵敏度")]
[SerializeField]
private int MouseWheelSensitivity = 2;
[Header("最近距离")]
[SerializeField]
public int MouseZoomMin = 750;
[Header("最远距离")]
[SerializeField]
public int MouseZoomMax = 2000;
[Header("水平旋转速度")]
[SerializeField]
private float xSpeed = 150.0f;
[Header("竖直旋转速度")]
[SerializeField]
private float ySpeed = 80.0f;
[Header("鼠标移动灵敏度")]
[SerializeField]
private float mouseMoveSensitivity = 3.0f;
[Header("角度限制")]
[SerializeField]
private int yMinLimit = 0;
[SerializeField]
private int yMaxLimit = 89;
[Header("摄像机初始角度")]
[SerializeField]
private float xRot = 0;
[SerializeField]
private float yRot = 0;
[Header("摄像机位置")]
[SerializeField]
private Vector3 camPos;//= new Vector3(0, 0, 0);
public float normalDistance;//初始摄像机距离,无法在面板显示
public static float x;//= 69f;
public static float y;// 34.2f;
private Quaternion rotation;
public static Vector3 CameraTarget;
// [HideInInspector]
public bool isExit;//打开 控制相机
public bool isShuBiao;//Flase=拉近 状态
public Transform SelfTransform;
private void Awake()
{
Instance = this;
SelfTransform = this.transform;
}
void Start()
{
//初始化
isExit = true;
isShuBiao = true;
x = yRot;
y = xRot;
target = targetmodel;
Vector3 posC = camPos - target.position;
normalDistance = Mathf.Sqrt(Mathf.Pow(posC.x, 2) + Mathf.Pow(posC.y, 2) + Mathf.Pow(posC.z, 2));
rotation = Quaternion.Euler(new Vector3(y, x, 0f));
transform.rotation = rotation;
float z = target.transform.position.z - normalDistance;
transform.position = camPos;//rotation * new Vector3(transform.position.x, transform.position.y, z);
CameraTarget = transform.position + transform.forward.normalized * normalDistance;
x = transform.localEulerAngles.x;
y = transform.localEulerAngles.y;
}
public void Init()
{
isExit = true;
isShuBiao = true;
Vector3 posC = camPos - target.position;
normalDistance = Mathf.Sqrt(Mathf.Pow(posC.x, 2) + Mathf.Pow(posC.y, 2) + Mathf.Pow(posC.z, 2));
rotation = Quaternion.Euler(new Vector3(90f, 0f, 0f));
transform.rotation = rotation;
transform.position = new Vector3(0f, 0f, 0f);
CameraTarget = transform.position + transform.forward.normalized * normalDistance;
x = transform.localEulerAngles.x;
y = transform.localEulerAngles.y;
}
public float movespeed = 500;
void LateUpdate()
{
if (isExit)
{
if (isShuBiao)
{
// 定义3个值控制移动
float xm = 0, zm = 0;
//按键盘W向上移动
if (Input.GetKey(KeyCode.UpArrow) || Input.GetKey(KeyCode.W))
{
if (transform.position.y <= MouseZoomMin)//限制 最小距离
{
}
else
{
this.transform.Translate(Vector3.forward * movespeed * Time.deltaTime);
}
}
else if (Input.GetKey(KeyCode.DownArrow) || Input.GetKey(KeyCode.S))//按键盘S向下移动
{
if (transform.position.y >= MouseZoomMax)//限制 最大距离
{
}
else
{
this.transform.Translate(Vector3.back * movespeed * Time.deltaTime);
}
}
if (Input.GetKey(KeyCode.LeftArrow) || Input.GetKey(KeyCode.A))//按键盘A向左移动
{
// xm -= 500 * Time.deltaTime;
this.transform.Translate(Vector3.left * movespeed * Time.deltaTime);
}
else if (Input.GetKey(KeyCode.RightArrow) || Input.GetKey(KeyCode.D))//按键盘D向右移动
{
// xm += 500 * Time.deltaTime;
this.transform.Translate(Vector3.right * movespeed * Time.deltaTime);
}
if (Input.GetMouseButton(1))//鼠标右键
{
y += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
x -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
x = ClampAngle(x, yMinLimit, yMaxLimit);
var rotation = Quaternion.Euler(x, y, 0);
transform.rotation = rotation;
}
else if (Input.GetAxis("Mouse ScrollWheel") != 0)//鼠标滚轮
{
// normalized = (transform.position - CameraTarget).normalized;
if (normalDistance >= MouseZoomMin && normalDistance <= MouseZoomMax)
{
this.transform.position += this.transform.forward * Input.GetAxisRaw("Mouse ScrollWheel") * Time.timeScale * MouseWheelSensitivity;
Vector3 p = this.transform.position - CameraTarget;
normalDistance = Mathf.Sqrt(Mathf.Pow(p.x, 2) + Mathf.Pow(p.y, 2) + Mathf.Pow(p.z, 2));
}
if (normalDistance < MouseZoomMin)
{
normalDistance = MouseZoomMin;
}
if (normalDistance > MouseZoomMax)
{
normalDistance = MouseZoomMax;
}
if (transform.position.y < MouseZoomMin)//限制 最小距离
{
transform.position = new Vector3(transform.position.x, MouseZoomMin, transform.position.z);
}
if (transform.position.y > MouseZoomMax)//限制 最大距离
{
transform.position = new Vector3(transform.position.x, MouseZoomMax, transform.position.z);
}
}
}
else
{
if (transform.position.y > MouseZoomMax)//限制 最小距离
{
isShuBiao = true;
}
//缩放
if (Input.GetAxis("Mouse ScrollWheel") > 0)
{
transform.Translate(Vector3.forward * 100f);//速度可调 自行调整
}
if (Input.GetAxis("Mouse ScrollWheel") < 0)
{
transform.Translate(Vector3.forward * -100f);//速度可调 自行调整
}
//旋转
x = transform.localEulerAngles.x;
y = transform.localEulerAngles.y;
}
}
}
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);
}
//--------------------围绕的物体并且 相机定位物体-------------------//
#region
//public Transform CenObj;//围绕的物体
//private Vector3 Rotion_Transform;
//private new Camera camera;
bool bo;
//private Transform mainCameraTr; //主摄像机
//public Transform lookAtTarget; //摄像机看向的目标
//private float cameraDistance = 50.0F; //摄像机与看向目标的距离
//private float cameraHeight = 800.0F; //摄像机高度
//private float cmaeraOffset = 1000.0F; //摄像机的偏移
//private float mainCameraMoveSpeed = 1F; //主摄像机移动的速度
//private Vector3 lookAtTargetPosition; //看向目标时的位置
//private Quaternion lookAtTargetRotation; //看向目标,且旋转
//public bool isLookAtAppointTarget = false; //是否看向指定的物体
//public void SetInit(Transform CenObj_)
//{
// Debug.Log("点击了=" + CenObj_.name);
// isShuBiao = true;
// CenObj = CenObj_;
// Rotion_Transform = CenObj.position;
// lookAtTarget = CenObj_;
// LookAtAppointTarget();
// isShuBiao = false;
//}
//void Update()
//{
// //if (!isExit)
// //{
// // Ctrl_Cam_Move();
// // Cam_Ctrl_Rotation();
// //}
//}
/ <summary>
/ 摄像机看向指定物体的方法
/ </summary>
//public void LookAtAppointTarget()
//{
// if (lookAtTarget != null)
// {
// lookAtTargetPosition = new Vector3(lookAtTarget.transform.position.x + cmaeraOffset,
// lookAtTarget.transform.position.y + cameraHeight, lookAtTarget.transform.position.z + cameraDistance);
// isLookAtAppointTarget = true;
// }
// else
// {
// Debug.LogError(GetType() + "/LookAtAppointTarget()/看向的物体不存在,请检查!!!");
// }
// if (isLookAtAppointTarget == true)//是否看向物体
// {
// mainCameraTr.position = Vector3.Lerp(mainCameraTr.position, lookAtTargetPosition, 1 * mainCameraMoveSpeed);
// mainCameraTr.LookAt(lookAtTarget);
// }
// //if (isBack == true)
// //{
// // mainCameraTr.position = Vector3.Lerp(mainCameraTr.position, lookAtTargetPosition, 10 * mainCameraMoveSpeed);
// //}
//}
#endregion
}
}