unity鼠标中键怎么控制unity 视野范围远近

[Unity3D]Unity3D游戏开发之鼠标旋转、缩放实现3D物品展示 - 推酷
[Unity3D]Unity3D游戏开发之鼠标旋转、缩放实现3D物品展示
各位朋友,大家好,我是秦元培,欢迎大家关注我的博主,我的博客地址是
。最近博主重点研究了摄像机旋转、缩放等问题,那么今天为大家分享的是一个在3D展示中比较常用的功能,即通过鼠标右键实现旋转、鼠标滚轮实现缩放、鼠标中键实现平移。本文采用的方法依然是在
这篇文章中所采用的方法,所以如果大家对于这部分内容不太了解的话,最好先去看看这篇文章。好了,下面我们将以一个具体的实例来讲解今天的内容。如图,是博主创建的一个简单地场景。我们希望实现 通过鼠标右键实现对角色的旋转、鼠标滚轮实现对角色的缩放、鼠标中键实现对角色的平移。
& & 好了,接下来我们来创建一个名为FreeView的脚本,该脚本依附在主相机上,下面我们来看它的实现过程:
using UnityE
using System.C
public class FreeView : MonoBehaviour {
//观察目标
public Transform T
//观察距离
public float Distance = 5F;
//旋转速度
private float SpeedX=240;
private float SpeedY=120;
//角度限制
private float
MinLimitY = -180;
private float
MaxLimitY = 180;
//旋转角度
private float mX = 0.0F;
private float mY = 0.0F;
//鼠标缩放距离最值
private float MaxDistance=10;
private float MinDistance=1.5F;
//鼠标缩放速率
private float ZoomSpeed=2F;
//是否启用差值
public bool isNeedDamping=
public float Damping=10F;
//存储角度的四元数
private Quaternion mR
//定义鼠标按键枚举
private enum MouseButton
//鼠标左键
MouseButton_Left=0,
//鼠标右键
MouseButton_Right=1,
//鼠标中键
MouseButton_Midle=2
//相机移动速度
private float MoveSpeed=5.0F;
//屏幕坐标
private Vector3 mScreenP
//坐标偏移
private Vector3 mO
void Start ()
//初始化旋转角度
mX=transform.eulerAngles.x;
mY=transform.eulerAngles.y;
void LateUpdate ()
//鼠标右键旋转
if(Target!=null && Input.GetMouseButton((int)MouseButton.MouseButton_Right))
//获取鼠标输入
mX += Input.GetAxis(&Mouse X&) * SpeedX * 0.02F;
mY -= Input.GetAxis(&Mouse Y&) * SpeedY * 0.02F;
//范围限制
mY = ClampAngle(mY,MinLimitY,MaxLimitY);
//计算旋转
mRotation = Quaternion.Euler(mY, mX, 0);
//根据是否插值采取不同的角度计算方式
if(isNeedDamping){
transform.rotation = Quaternion.Lerp(transform.rotation,mRotation, Time.deltaTime*Damping);
transform.rotation = mR
//鼠标中键平移
//鼠标滚轮缩放
Distance-=Input.GetAxis(&Mouse ScrollWheel&) * ZoomS
Distance=Mathf.Clamp(Distance,MinDistance,MaxDistance);
//重新计算位置
Vector3 mPosition = mRotation * new Vector3(0.0F, 0.0F, -Distance) + Target.
//设置相机的位置
if(isNeedDamping){
transform.position = Vector3.Lerp(transform.position,mPosition, Time.deltaTime*Damping);
transform.position = mP
//角度限制
private float
ClampAngle (float angle,float min,float max)
if (angle & -360) angle += 360;
if (angle &
360) angle -= 360;
return Mathf.Clamp (angle, min, max);
大家是不是觉得这部分代码很熟悉?不错,这里的原理都是一样的,大家只要掌握核心原理就可以了,即首先根据鼠标输入来计算旋转角、然后通过滚轮输入计算距离、最后通过四元数运算计算相机的角度和距离。好了,我们来看看最终的效果吧!
大家应该注意到博主没有实现按下鼠标中键平移的相关方法,因为这部分博主目前还没有彻底正确地写出来,如果大家知道的话,可以给博主留言,或者等博主什么时候想清楚了再来更新这篇博客吧。博主的博客会经常更新的,希望大家继续关注我的博客吧。好了,最后我们再来做一个迁移,我们将把这个功能移植到Android平台上,本来想把这部分作为Android手势控制单独写一篇文章的,可是感觉这里的代码都是相似的,再写一篇实在没有必要,所以,就直接给出代码吧!
using UnityE
using System.C
public class MobileInput : MonoBehaviour {
//观察目标
public Transform T
//观察距离
public float Distance = 2F;
//距离最值
public float MaxDistance=5F;
public float MinDistance=0.5F;
//缩放速率
private float ZoomSpeed=0.15F;
//旋转速度
private float SpeedX=240;
private float SpeedY=120;
//角度限制
private float
MinLimitY = 5;
private float
MaxLimitY = 180;
//旋转角度
private float mX=0;
private float mY=0;
//当前手势
private Vector2 mP
void Start ()
//允许多点触控
Input.multiTouchEnabled=
//初始化旋转
mX=Target.eulerAngles.x;
mY=Target.eulerAngles.y;
void Update ()
if(!Target)
//单点触控
if(Input.touchCount==1)
//手指处于移动状态
if(Input.touches[0].phase==TouchPhase.Moved)
mX+=Input.GetAxis(&Mouse X&) * SpeedX * 0.02F;
mY-=Input.GetAxis(&Mouse X&) * SpeedY * 0.02F;
mY=ClampAngle(mY,MinLimitY,MaxLimitY);
//多点触控
if(Input.touchCount&1)
//两只手指都处于移动状态
if(Input.touches[0].phase==TouchPhase.Moved || Input.touches[1].phase==TouchPhase.Moved)
//计算移动方向
Vector2 mDir=Input.touches[1].position-Input.touches[0].
//根据向量的大小判断当前手势是放大还是缩小
if(mDir.sqrMagnitude&mPos.sqrMagnitude){
Distance-=ZoomS
Distance+=ZoomS
//限制距离
Distance=Mathf.Clamp(Distance,MinDistance,MaxDistance);
//更新当前手势
//计算相机的角度和位置
transform.rotation=Quaternion.Euler(new Vector3(mY,mX,0));
transform.position=transform.rotation * new Vector3(0,0,-Distance)+Target.
//角度限制
private 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与Android对接的一些东西,等博主研究好了就分享给大家,希望大家喜欢。最后送上:
每日箴言:
生活就是种律动,须有光有影,有左有右。人生就是一场无止境的漂泊。面对生活中那些触不及防的意外、突如其来的伤痛、从天而降的灾难,相信,只要有爱,就有足够的勇气去承受人生中所有的风雨,一切会变得轻松而释然。
喜欢我的博客请记住我的名字:秦元培,我博客地址是blog.csdn.net/qinyuanpei。
转载请注明出处,本文作者:秦元培,本文出处:http://blog.csdn.net/qinyuanpei/article/details/
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致unity(1)
如题目所示,本文实现这三个效果。所有代码都在pc端成功运行,移植到手机端改变相应的判断条件即可,核心算法没有问题。
一、 鼠标拖拽移动物体
public class mousedrag : MonoBehaviour
private Vector3 targetS
private Vector3 targetW
private Vector3 mouseS
private Vector3
Color oricolor = Color.
void Start ()
void OnMouseEnter()
GetComponent&Renderer&().material.color = Color.
void OnMouseExit()
GetComponent&Renderer&().material.color =
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) +
target.position = targetW
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;
public float yMinLimit = -30;
public float yMaxLimit = 30;
public float x = 0.0f;
public float y = 0.0f;
void Start()
Vector3 angels = transform.eulerA
x = angels.y;
y = angels.x;
void Update()
if(Input.GetMouseButton(0))
x += Input.GetAxis("Mouse X")*xSpeed*0.02f;
y += Input.GetAxis("Mouse Y")*ySpeed*0.02f;
void LateUpdate()
y = Mathf.Clamp(y,yMinLimit,yMaxLimit);
Quaternion rotation = Quaternion.Euler(y,-x,0);
transform.rotation =
这里部分参考了宣雨松的代码。
上周找了个实习,是用unreal做虚拟现实和游戏的,所以最近一直在熟悉虚幻4的UMG和blueprint。感觉blueprint可视化编程确实效率很高,在开发大型游戏、虚拟现实方面可以减轻一定的代码工作量,不过虚幻的umg系统确实太垃圾了,ui做起来太费事。
今后可能unity方面的文章会很少写了,抓紧时间学习虚幻引擎。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:30405次
排名:千里之外
原创:23篇
(2)(1)(2)(1)(4)(6)(1)(3)(3)(5)(6)Unity3D获取当前键盘按键及Unity3D鼠标、键盘的基本操作
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了Unity3D获取当前键盘按键及Unity3D鼠标、键盘的基本操作的相关资料,需要的朋友可以参考下
获取当前键盘按键,代码如下:
using UnityE
using System.C
public class GetCurrentKey : MonoBehaviour {
KeyCode currentK
void Start ()
currentKey = KeyCode.S
void OnGUI()
if (Input.anyKeyDown)
Event e = Event.
if (e.isKey)
currentKey = e.keyC
Debug.Log("Current Key is : " + currentKey.ToString());
下面给大家介绍Unity3D鼠标、键盘的基本操作
GetKey&&&&&&&&&&&& 当通过名称指定的按键被用户按住时返回true
GetKeyDown&& 当用户按下指定名称的按键时的那一帧返回true。
GetKeyUp&&&&&&& 在用户释放给定名字的按键的那一帧返回true。&
GetAxis(“Horizontal")和GetAxis(“Verical”) 用方向键或WASD键来模拟-1到1的平滑输入&&&
键盘判断:&&&
If(Input.GetKeyDown(KeyCode.A)){//KeyCode表示包含键盘所有键&&&&&
print(“按下A键”); }& If(Input.GetKeyUp(KeyCode.D)){//当按D键松开时&&&&
print(“松开D键”); }& If(Input.GetAxis(“Horizontal")){//当按下水平键时&&&
print(“按下水平键”); }& If(Input.GetKeyUp("Verical“)){当按下垂直键时&&&&
print(“按下垂直键”); }&&
GetButton&&&&&&&&&& 根据按钮名称返回true当对应的虚拟按钮被按住时。
GetButtonDown&&&&& 在给定名称的虚拟按钮被按下的那一帧返回true。
GetButtonUp&&&&&&& 在用户释放指定名称的虚拟按钮时返回true。&&
鼠标判断:&&&
if(Input.GetButton("Fire1")){//Fire1表示按下鼠标左键&&&&&&&
print(“按下鼠标左键”); }& if (Input.GetMouseButton(0)) {//0表示鼠标左键&&&&&
Debug.Log("按下鼠标左键"); }&& if (Input.GetMouseButton(1)) {//1表示鼠标右键&&&&
Debug.Log("按下鼠标右键");& }& if (Input.GetMouseButton(2)) {//2表示鼠标中键&&&&
Debug.Log("按下鼠标中键"); }&
给物体施加普通力:&&&
1、先给物体添加刚体&
2、transform.rigidbody.AddForce(0,0,1000);& 一个简单例子让小球撞破墙:&
代码如下:&
using UnityE
using System.C
public class Cube : MonoBehaviour { // Use this for initialization
void Start () { }
// Update is called once per frame void Update () {
if(Input.GetKey(KeyCode.W)){//当鼠标按下W键时,小球向前移动
transform.Translate(Vector3.forward);
if(Input.GetKey(KeyCode.S)){当鼠标按下S键时,小球向后移动
transform.Translate(Vector3.back);
天猫双十一活动
} if(Input.GetKey(KeyCode.A)){当鼠标按下A键时,小球向左移动
transform.Translate(Vector3.left);
if(Input.GetKey(KeyCode.D)){当鼠标按下D键时,小球向右移动
transform.Translate(Vector3.right);
} if(Input.GetButton("Fire1")){//当点击鼠标左键时,小球撞塌墙
transform.rigidbody.AddForce(0,0,200);//物体向前移动的力为200
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 unity3d远近声音衰减 的文章

 

随机推荐