当前位置: 首页 > news >正文

RTS风格相机控制

屏幕空间 → 相机局部空间 → 世界空间

输入来自:

  • 鼠标 delta(PC)
  • 触摸 delta(Mobile)

转换流程:

屏幕拖拽↓
相机 right / forward(局部轴)↓(投影到XZ平面)
世界空间移动

🧩 完整实现代码

using UnityEngine;public class CameraController : MonoBehaviour
{public Transform cam;                 // 控制的相机public float moveSpeed = 0.1f;        // 平移灵敏度(屏幕→世界转换系数)public float zoomSpeed = 5f;          // 缩放速度public float minZoom = 100f;          // 最小高度public float maxZoom = 150f;          // 最大高度// PC 鼠标拖拽记录private Vector3 lastMousePos;// Mobile 单指拖拽记录private Vector2 lastTouchPos;// Mobile 双指缩放记录private float lastTouchDistance;void Update(){// =========================// PC端输入(鼠标)// =========================
#if UNITY_EDITOR || UNITY_STANDALONEHandlePC();
#endif// =========================// Mobile端输入(触摸)// =========================
#if UNITY_ANDROID || UNITY_IOSHandleMobile();
#endif}// =========================// PC 控制逻辑// =========================void HandlePC(){// ---------- 鼠标右键按下:记录起点 ----------if (Input.GetMouseButtonDown(1))lastMousePos = Input.mousePosition;// ---------- 鼠标右键拖拽 ----------if (Input.GetMouseButton(1)){// 计算屏幕空间位移(像素)Vector3 delta = Input.mousePosition - lastMousePos;lastMousePos = Input.mousePosition;ApplyPan(delta);}// ---------- 鼠标滚轮缩放 ----------float scroll = Input.GetAxis("Mouse ScrollWheel");if (scroll != 0){float newY = cam.position.y - scroll * zoomSpeed;// 限制相机高度范围newY = Mathf.Clamp(newY, minZoom, maxZoom);cam.position = new Vector3(cam.position.x, newY, cam.position.z);}}// =========================// Mobile 控制逻辑// =========================void HandleMobile(){// ---------- 单指拖拽(平移) ----------if (Input.touchCount == 1){Touch t = Input.GetTouch(0);// 记录起始触摸点if (t.phase == TouchPhase.Began)lastTouchPos = t.position;// 拖动中if (t.phase == TouchPhase.Moved){Vector2 delta = t.position - lastTouchPos;lastTouchPos = t.position;ApplyPan(delta);}}// ---------- 双指缩放(缩放相机高度) ----------else if (Input.touchCount == 2){Touch t0 = Input.GetTouch(0);Touch t1 = Input.GetTouch(1);// 当前两指距离float curDist = Vector2.Distance(t0.position, t1.position);// 任一手指刚触发时初始化,避免跳变if (t0.phase == TouchPhase.Began || t1.phase == TouchPhase.Began){lastTouchDistance = curDist;return;}// 距离变化量float delta = curDist - lastTouchDistance;lastTouchDistance = curDist;// 根据距离变化调整高度float newY = cam.position.y - delta * 0.02f;newY = Mathf.Clamp(newY, minZoom, maxZoom);cam.position = new Vector3(cam.position.x, newY, cam.position.z);}}// =========================// 🎯 核心平移逻辑(统一PC/Mobile)// =========================void ApplyPan(Vector2 delta){// -----------------------------------------// 1️⃣ 获取相机局部坐标轴(世界空间表示)// -----------------------------------------// 相机右方向(局部X轴)Vector3 right = cam.right;// 投影到XZ平面(避免上下漂移)right.y = 0;right.Normalize();// 相机前方向(局部Z轴)Vector3 forward = cam.forward;// 同样投影到XZ平面forward.y = 0;forward.Normalize();// -----------------------------------------// 2️⃣ 屏幕空间 → 世界空间映射// -----------------------------------------// delta.x → 左右拖动// delta.y → 上下拖动// 注意负号:实现“拖动世界”的感觉(RTS常见)Vector3 move =(-delta.x * right + -delta.y * forward) * moveSpeed;// -----------------------------------------// 3️⃣ 应用到相机位置// -----------------------------------------cam.position += move;}
}
http://www.jsqmd.com/news/719734/

相关文章:

  • 数字散斑DIC技术:金属薄板焊接变形全场动态监测及工艺优化全解析
  • 以开源技术、跨境数据与绿色算力为支点,“开放东方社区”上线
  • 成都金士力:极端环境电机驱动领域的专业技术服务商 - 深度智识库
  • Qwen2.5-14B-Instruct推理显存占用分析:Pixel Script Temple双卡部署内存分配图解
  • 用STM32F103C8T6驱动DS1302时钟模块,我踩过的坑和完整代码分享(含逻辑分析仪调试)
  • 别再只用元胞数组了!MATLAB结构体(struct)的5个高效技巧与常见误区
  • DIC技术:铁路道桥箱梁四点弯曲载荷下的应变与裂纹全场分析
  • 乌鲁木齐本地黄金回收新选择 小邓黄金以透明服务助力市民安心变现 - 博客万
  • 如何用免费开源PCB查看器OpenBoardView快速定位电路板问题
  • 2026年全国消防排烟风机与工业通风源头厂家深度测评指南 - 优质企业观察收录
  • 语音转文字技术如何选择?faster-whisper-GUI一站式解决方案深度解析
  • ProperTree完整指南:跨平台Plist编辑器快速上手与高效使用
  • 如何用免费开源统计软件JASP解决你的数据分析痛点?终极完整指南
  • 2026年呼伦贝尔自驾旅游怎么选?解码自由侠国际旅行社有限公司硬核实力 - 深度智识库
  • CSDN无耻之路
  • HoRain云--Perl包与模块实战
  • 成都市蜀宏吊装工程:郫都区设备吊装搬运服务 - LYL仔仔
  • 航顺全球最小M4晶圆嵌入式封装极限挑战
  • 2026年4月 RTX 5080 显卡品牌横评实测:散热、供电、做工,三大终极排行榜 - 华Sir1
  • 如何用微信小程序为情侣打造专属互动空间:Rainbow-Cats完整实现指南
  • 终极Azure Kinect传感器SDK完整指南:从零开始掌握3D视觉开发
  • 案例之 逻辑回归_癌症预测
  • pH计品牌推荐:耐用性强、技术先进且售后响应快的品牌对比(产品包含台式/笔式/实验室PH计) - 品牌推荐大师1
  • Flutter for OpenHarmony 天气应用实战DAY2:天气图标渲染+多日预报布局开发
  • 从游戏背包到任务队列:用C++ list的splice实战优化你的数据结构设计
  • **用Python实现从头到尾的分子几何优化:计算化学中的发散创新实践**在现代计算化学中,**分子几何优化(Geometr
  • FAST-LIVO:高性能稀疏直接法激光-视觉-惯导紧耦合SLAM系统深度解析
  • 上海恩翔搬家服务:上海市国际物流推荐哪几家 - LYL仔仔
  • 别再乱画了!新手用嘉立创打样PCB,这5个设计细节最容易翻车
  • 免费跨平台剧本写作软件Trelby:告别格式烦恼,专注故事创作