<Unity>鼠标拖动物体、按下鼠标左键旋转观察物体、鼠标滚轮缩放视野
2015-10-23 22:08
1021 查看
如题目所示,本文实现这三个效果。所有代码都在pc端成功运行,移植到手机端改变相应的判断条件即可,核心算法没有问题。
一、 鼠标拖拽移动物体
效果演示
源代码
二、滚轮控制视野缩放
效果演示
在移动端时,需要判断两手指的移动距离。不在这里写出来了。
三、按下鼠标左键旋转物体
效果演示
源代码
这里部分参考了宣雨松的代码。
上周找了个实习,是用unreal做虚拟现实和游戏的,所以最近一直在熟悉虚幻4的UMG和blueprint。感觉blueprint可视化编程确实效率很高,在开发大型游戏、虚拟现实方面可以减轻一定的代码工作量,不过虚幻的umg系统确实太垃圾了,ui做起来太费事。
今后可能unity方面的文章会很少写了,抓紧时间学习虚幻引擎。
一、 鼠标拖拽移动物体
效果演示
源代码
public class mousedrag : MonoBehaviour { private Vector3 targetScreenpos;//拖拽物体的屏幕坐标 private Vector3 targetWorldpos;//拖拽物体的世界坐标 private Transform target;//拖拽物体 private Vector3 mouseScreenpos;//鼠标的屏幕坐标 private Vector3 offset;//偏移量 Color oricolor = Color.black;//物体本来的颜色 void Start () { target = transform; } void OnMouseEnter() { //当鼠标在物体上时,改变物体颜色。 GetComponent<Renderer>().material.color = Color.blue; } void OnMouseExit() { GetComponent<Renderer>().material.color = oricolor; } //被移动物体需要添加collider组件,以响应OnMouseDown()函数 //基本思路。当鼠标点击物体时(OnMouseDown(),函数体里面代码只执行一次),记录此时鼠标坐标和物体坐标,并求得差值。如果此后用户仍然按着鼠标左键,那么保持之前的差值不变即可。 //由于物体坐标是世界坐标,鼠标坐标是屏幕坐标,需要进行转换。具体过程如下所示。 IEnumerator OnMouseDown() { targetScreenpos = Camera.main.WorldToScreenPoint(target.position); mouseScreenpos = new Vector3(Input.mousePosition.x,Input.mousePosition.y,targetScreenpos.z); offset = target.position -Camera.main.ScreenToWorldPoint(mouseScreenpos); while(Input.GetMouseButton(0))//鼠标左键被持续按下。 { mouseScreenpos = new Vector3(Input.mousePosition.x,Input.mousePosition.y,targetScreenpos.z); targetWorldpos = Camera.main.ScreenToWorldPoint(mouseScreenpos) + offset; target.position = targetWorldpos; yield return new WaitForFixedUpdate(); } } }
二、滚轮控制视野缩放
效果演示
void Update() { Camera.main.fieldOfView = Camera.main.fieldOfView + Input.GetAxis("Mouse ScrollWheel")*20; }
在移动端时,需要判断两手指的移动距离。不在这里写出来了。
三、按下鼠标左键旋转物体
效果演示
源代码
//旋转速度,需要调试 public float xSpeed = 250.0f; public float ySpeed = 130.0f; //限制旋转角度,物体绕x轴旋转限制,不能上下颠倒。 public float yMinLimit = -30; public float yMaxLimit = 30; //物体的旋转角度 public float x = 0.0f; public float y = 0.0f; void Start() { //初始化旋转角度,记录开始时物体的旋转角度。 Vector3 angels = transform.eulerAngles; x = angels.y; y = angels.x; // } void Update() { if(Input.GetMouseButton(0)) { //鼠标沿x轴的移动乘以系数当作物体绕y轴的旋转角度。 //鼠标沿y轴的移动乘以系数当作物体绕x轴的旋转角度。 x += Input.GetAxis("Mouse X")*xSpeed*0.02f; y += Input.GetAxis("Mouse Y")*ySpeed*0.02f; } } void LateUpdate() { //限制绕x轴的移动。 y = Mathf.Clamp(y,yMinLimit,yMaxLimit); Quaternion rotation = Quaternion.Euler(y,-x,0); transform.rotation = rotation; }
这里部分参考了宣雨松的代码。
上周找了个实习,是用unreal做虚拟现实和游戏的,所以最近一直在熟悉虚幻4的UMG和blueprint。感觉blueprint可视化编程确实效率很高,在开发大型游戏、虚拟现实方面可以减轻一定的代码工作量,不过虚幻的umg系统确实太垃圾了,ui做起来太费事。
今后可能unity方面的文章会很少写了,抓紧时间学习虚幻引擎。
相关文章推荐
- UNITY 5.2 Vector2 结构
- Unity3D的一个坑
- 冰材质1-iceTrans
- NVIDIA TEGRA3与PhysX技术在UNITY引擎的使用及优化技巧
- Unity 分析器(仅专业版) Profiler (Pro only)
- [Unity]关于多角色自由切换主操作角色的问题
- 将Unity页面添加到iOS APP中
- 【Unity Shaders】Alpha Test和Alpha Blending
- Unity5中的粒子缩放(附测试源码)
- Unity5中的粒子缩放(附测试源码)
- Unity编译器VS下Shader高亮插件NShader安装
- Unity3D中四元数
- Unity Alpha融合参数(便查)
- Unity Animator动画
- Unity 坐标系笔记
- unity3d抛物线的脚本
- 【Unity3D游戏开发学习笔记】(五)灵魂降临—Unity脚本的简单运用
- Unity - 优化(二)
- 游戏开发设计模式之状态模式 & 有限状态机 & c#委托事件(unity3d 示例实现)
- 游戏开发设计模式之状态模式 & 有限状态机 & c#委托事件(unity3d 示例实现)