unity3D基础学习 通过判断鼠标点击的是否是目标物体,物体旋转,滑动滚轮缩放拉近视角
贴代码:
摄像机的拉近视角代码:
public Transform target;
public float minFov = 15f;
public float maxFov = 70f;
public float sensitivity = 10f;
void Start()
{
transform.LookAt(target);
}
void Update()
{
if (Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl))
{
float fov = Camera.main.fieldOfView;
fov -= Input.GetAxis("Mouse ScrollWheel") * sensitivity;
fov = Mathf.Clamp(fov, minFov, maxFov);
Camera.main.fieldOfView = fov;
}
}
主要是通过控制摄像机的fieldOfView属性,可以自己在场景视图中调节看一下。
通过判断选中物体是否是目标物体,如果是就旋转
代码:
public Transform target;//目标物体
public float HorizontalSpeed = 10f;
public float VerticalSpeed = 10f;
string RotateDirection = null;//判断当前旋转方向,用于固定当前旋转方向,不让用户在横向旋转时纵向旋转,反之同理。
bool isTarget = false;//判断当前射线碰撞到的物体是否为目标物体
int RotateState = 0;//当前旋转状态0不旋转,1匀速旋转
//GameObject PanelToolTips;
void Start () {
if(!target)
{
target=gameObject.transform;//如果target不存在,就设置脚本附加的物体为target
}
}
void Update () {
if (Input.GetMouseButton(0))
{
if (isTarget)//判断当前是否选中目标物体
{
RotateState = 1;
RotateTarget(target);
}
}
if (Input.GetMouseButtonUp(0))
{
RotateDirection = null;
isTarget = false;//当鼠标抬起时,设置当前物体不是目标物体
RotateState = 0;
}
if (Input.GetMouseButtonDown(0))//每次按下鼠标左键都用射线检测碰撞的物体是什么
{
Ray();
}
}
/// <summary>
/// 旋转匀速物体方法//
/// </summary>
/// /// <param name="transformObj">要旋转的目标物体</param>
void RotateTarget(Transform transformObj)
{
float h = Input.GetAxis("Mouse X");//右正左负
float v = Input.GetAxis("Mouse Y");//上正下负
if ((Mathf.Abs(h) > Mathf.Abs(v)) && (RotateDirection != "down" && RotateDirection != "up"))//此处设置当物体横向旋转时不能纵向旋转,纵向旋转时不能横向旋转,如果不需要,可把&&后面删除,RotateDirection变量也可删除
{
if (h < 0)
{
transformObj.Rotate(Vector3.up, HorizontalSpeed);
RotateDirection = "left";
}
else if (h > 0)
{
transformObj.Rotate(-Vector3.up, HorizontalSpeed);
RotateDirection = "right";//当前旋转方向为右向
}
RotateState = 1;//匀速旋转
}
else if ((Mathf.Abs(h) < Mathf.Abs(v)) && (RotateDirection != "left" && RotateDirection != "right"))//同上
{
if (v < 0)
{
transformObj.RotateAround(target.transform.position, Vector3.left, VerticalSpeed);
RotateDirection = "down";//当前旋转方向为下向
}
else if (v > 0)
{
transformObj.RotateAround(target.transform.position, Vector3.right, VerticalSpeed);
RotateDirection = "up";//当前旋转方向为上向
}
RotateState = 1;
}
//print(RotateDirection);
}
/// <summary>
/// 从主相机发送射线,判断当前点击的物体是否是要旋转的物体
/// </summary>
void Ray()
{
Ray ray=Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
GameObject hitObj=null;
if (Physics.Raycast(ray, out hit, 100f))
{
hitObj = hit.collider.gameObject;
print(hitObj.name);
if ((hitObj.transform.name=target.name )//如果当前碰撞的物体是目标物体
{
target = hitObj.transform;
isTarget = true;
}
}
}
unity3D基础学习 通过判断鼠标点击的是否是目标物体,物体旋转,滑动滚轮缩放拉近视角的更多相关文章
- Unity3D基础学习 NGUI Example 7-Scroll View(Panel)制作固定包裹栏,点击传递参数显示物体
最终效果如下: 实现ScrollView主要是NGUI的三个脚本"UIDraggable Panel","UIGrid","UIDrag Panel ...
- C++五子棋(三)——判断鼠标有效点击
分析 在鼠标左键点击时,我们不能让新棋子在已有棋子的位置落下,同时我们还要让棋子在规定位置落下--棋盘线的交点处. 功能实现 创建数据类型 创建头文件chessData.h和源文件chessData. ...
- (转载)【Unity3D学习】获取鼠标点击所对应的GameObject
刚开始学习Unity 3D,新手遇到的坑都是泪对自由的抗争.直入主题~ 首先,为GameObject需要添加组件“Box Collider”. 然后,在脚本中的Update方法中添加如下代码. if( ...
- Unity3D基础学习 加载场景时隐藏物体,点击显示时显示物体
隐藏物体有两种方法,一是设置Meshrender为False,即不渲染物体. 二是设置物体为False,禁用物体,我使用的第二种. 当场景中需要隐藏的物体很多时,我们可以添加一个层来表示需要隐藏的物体 ...
- Unity3D基础学习之AssetBundle 资源包创建与加载
前几天做了AssentBundle的例子,遇到了问题,在论坛上问了三天都没人解答,最后在一个朋友的帮助下解决了.下面介绍AssentBundle. AssetBundles让你通过WWW类流式加载额外 ...
- GDI画图,判断鼠标点击点在某一画好的多边形、矩形、图形里
Region.IsVisible方法 简单方便准确 private bool CheckPntInPoly(Point[] points, Point pnt) { || pnt == Point.E ...
- Unity3D基础学习 NGUI自带Tooltip制作提示文字
简介 NGUI自带的的例子Character中含有一个Tooltip,可以鼠标悬浮到某对象时显示提示文字.非常方便. 创建UITooltip 首先你需要在场景NGUi相机下建立一个空物体我把它命名为T ...
- js 如何判断鼠标点击事件还是js代码调用
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- Unity3D基础学习 利用NGUI的Texture播放视频
利用NGUI播放视频,首先你得导入你的视频 你的电脑中必须安装QuickTime软件,没有,去下一个,如果是Windows系统,安装完之后重启. 接下来转换你的视频格式,如果你的视频在QuickTim ...
随机推荐
- Android界面刷新方法
Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中 ...
- 昨天做了一个使用javamail发送文件的demo
记录一下过程. 两种版本第一个demo是纯java文件.一个就可以,是我在网上搜索到的,第二个demo是我在ssh框中中写的jsp页面demo 1.java版本: package com.zq.www ...
- OpenXmlSdk导出Excel
感觉OpenXmlSdk的语法真的不是很友好.研究了半天,只实现了简单的导出功能.对于单元格样式的设置暂时还是搞明白,网上的资料真的很少,官方文档是英文的.中文的文章大都是用工具(Open XML S ...
- 关于<:if>没有<c:else>解决方案
<c:if>没有<c:else>可以用<c:choose>来取代结构: <c:choose> <c:when test=""& ...
- My.Ioc 代码示例——Lifetime 和 ILifetimeScope
很多 Ioc 框架在创建对象的过程中,都会采取某种方式来缓存/复用/释放已构建的对象.在 My.Ioc 中,这个目的是通过 Lifetime/ILifetimeScope 来实现的.其中,Lifeti ...
- Android设计图(标注、切图)
1.Android: 1)Android的单位是dp 2)分为ldpi/mdpi/hdpi/xhdpi/xxhdpi. 3)分辨率对应DPI ldpi QVGA (240×320) mdpi HV ...
- UIScrollView 之图片缩放
UIScrollView 之图片缩放 有些时候,我们可能要对某些内容进行手势缩放,如下图所示 UIScrollView不仅能滚动显示大量内容,还能对其内容进行缩放处理 也就是说,要完成缩放功能的话,只 ...
- 使用Eclipse创建Hibernate工程
创建一个java project项目,加入hibernate的jar包和数据库驱动包,并引入到项目.
- PHP表单提交验证各种方式
<!DOCTYPE unspecified PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www. ...
- 在iframe里调用parent.func()引出的js函数运行在它们被定义的作用域里,而不是它们被执行的作用域里
有个document里定义了一个函数func(),同时在document里嵌入了一个iframe,在这个iframe里调用父窗口的方法:parent.func(),本来我以为这个函数的运行环境是在这个 ...