1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > Unity鼠标拖动物体 按下鼠标左键旋转观察物体 鼠标滚轮缩放视野

Unity鼠标拖动物体 按下鼠标左键旋转观察物体 鼠标滚轮缩放视野

时间:2022-04-01 02:30:00

相关推荐

Unity鼠标拖动物体 按下鼠标左键旋转观察物体 鼠标滚轮缩放视野

如题目所示,本文实现这三个效果。所有代码都在pc端成功运行,移植到手机端改变相应的判断条件即可,核心算法没有问题。

一、 鼠标拖拽移动物体

效果演示

源代码

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方面的文章会很少写了,抓紧时间学习虚幻引擎。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。