unity快捷放置物体操作

Wesley13
• 阅读 694

https://connect.unity.com/p/zui-jia-shi-jian-dui-xiang-fang-zhi-he-wu-li-xiao-guo

最佳实践系列文章将探讨我们在与客户合作时遇到的一些常见的问题。这些都是我们的合作团队辛苦得出的经验和教训,我们很自豪能够和大家分享他们的智慧。我们已经为大家分享过以下内容:

《影子战术》层级优化经验分享

最佳实践 | 碰撞性能优化

最佳实践 | Unity项目设置

unity快捷放置物体操作

这其中的很多问题只有在真正制作主机游戏、手机游戏、或者处理巨量游戏内容时才会出现。如果能在开发早期就将这些问题考虑进去,那么开发过程就会更轻松,而游戏也会更炫酷。

将对象放置到理想位置

尽管摆放对象是在Unity中最为常见的任务之一,我们还是看到不少团队为了如何能更好地完成这项工作而苦恼。要把对象排列完美,不让角色跑出世界,不让寻路出现障碍,并让各个物理对象能够放置在理想的位置,这的确不是件轻松的事。

unity快捷放置物体操作

Unity提供了一些工具来方便处理这个问题,这些工具各自扮演着不同的角色。尤其是在我们想要制作大量重复使用的内容,或是制作一张放置了大量动态物理对象的场景,了解这些工具的使用方法则尤为重要。

使用正确的辅助工具

Unity中提供了变换、旋转和缩放工具,在Unity 2017.3中还加入了能同时拥有这三个功能的通用工具。这些小工具能在3D环境下修改游戏对象的变换属性。除此之外,还有2D环境下处理对象的矩形变换工具(Rect Transform)。

所有这些辅助工具的运作方式都与其所处的工作模式直接相关。如果将模式设为中心(Center),辅助工具将使用根据对象边界计算得出的对象中心点。这个计算结果是个近似值,所以在处理复杂对象时或许会感觉该中心点偏移了真正的中心点。

如果将辅助工具模式设为轴心(Pivot),辅助工具将使用对象自身引用框的原点(0,0,0)。这个轴心点是由创建该资源的作者在制作时设定的。通常需要将对象按照彼此相对的位置进行摆放时,我们推荐使用轴心模式,而且在制作资源时要留意轴心点的位置。

第二个切换按钮,全局/局部(Global / Local)切换按钮,确定了操作对象时所处的空间。设为全局(Global)意味着辅助工具将会对齐世界(x,y,z)坐标轴,而设为局部(Local)将会对齐对象自身的(x,y,z)坐标轴。通常我们需要在局部空间下处理对象。但如果我们想要让多个对象互相对齐,则会切换到全局坐标系,并使用网格对齐工具来排列对象。

吸附对象

在Unity中,最为直接的定位工具是按下CTRL键(Windows系统)或是Command键(OSX系统)来吸附网格。在我们通过坐标轴手柄(也就是分别为蓝、红、绿的坐标轴辅助工具)来移动对象时,按下吸附键会让对象根据当前网格大小计算的增量而移动,这个增量可以自行修改。

unity快捷放置物体操作

自动吸附设置(Snap Settings)菜单能为网格大小设置每个轴的数值,让我们控制旋转角度和缩放大小的吸附,还能将所选对象的当前变换属性近似取其最近的网格线。

吸附所有坐标轴(Snap All Axes)按钮在排列任意对象时十分有用。我们可以选择一组对象,将它们在坐标轴上吸附到网格,然后重新定位,这样就能把他们排列好了。效果如下图所示:

unity快捷放置物体操作

这个方法在处理规则几何体、大型关卡布局和设置碰撞块时十分管用。如果我们需要处理更为复杂的放置情况,则需要下面这些工具。

顶点吸附

在使用变换工具时按住V,变换辅助工具会切换为顶点吸附模式,显示为一个小方框。然后点击所选对象网格上的一个顶点,将其拖到光标下的任意顶点上。在处理任意网格的对齐时,尤其是要处理那些复杂的或是不存在碰撞的网格对齐时,这个方法很实用。

unity快捷放置物体操作

在上图中,不管是电线还是台灯都没有紧凑的碰撞网格,而且它们也都不是规则的立方体,所以它们不能用网格吸附或碰撞吸附处理。

如果需要这样放置多个游戏对象,我们也可以将顶点吸附模式保持在打开状态。按下Ctrl+Shift+V打开,按下Ctrl+V关闭。这样便不需要一直按住V就能顶点吸附多个对象了。

碰撞吸附

按下CTRL + SHIFT可以启用碰撞吸附。启用后,必须拖拽变换辅助工具中心的黄色小方框,而不是使用坐标轴控制工具。这样会让所选对象与光标下对象的碰撞体相对齐。

unity快捷放置物体操作

用顶点吸附或网格吸附来对齐网格在处理静态几何体时十分出色,但如果要处理动态对象,比如说互相穿透并在触碰后发射到空中的对象时,应该吸附到碰撞体而不是可见网格。

碰撞安置

如果有大量动态物理对象,或是十分复杂的关节系统,利用碰撞吸附来放置对象也许就不太合适。幸运的是,现在Unity编辑器中可以运行PhysX。它能模拟几秒的游戏时间,完成物理效果,然后保存完成时对象的位置信息。

unity快捷放置物体操作

下方是示例代码,代码中不仅有大量注释,还包含了调试信息绘制和一个菜单项。只要将其放入项目中的任何一个Editor文件夹里,便能看到一个新的GameMenu->Settle Physics菜单项。

示例代码:PhysicsSettler.cs

using UnityEngine; using UnityEditor; [InitializeOnLoad] class PhysicsSettler { static bool registered = false; static bool active = false; static Rigidbody[] workList; static bool cachedAutoSimulation; const float timeToSettle = 10f; static float activeTime = 0f; static PhysicsSettler() { if (!registered) { EditorApplication.update += Update; SceneView.onSceneGUIDelegate += OnSceneGUI; registered = true; } } [MenuItem("GameMenu/Settle Physics")] static void Activate() { if( !active ) { active = true; workList = Object.FindObjectsOfType(); cachedAutoSimulation = Physics.autoSimulation; activeTime = 0f; foreach( Rigidbody body in workList ) { body.WakeUp(); } } } [MenuItem("GameMenu/Settle Physics", true)] static bool checkMenu() { return !active; } static void Update() { if( active ) { activeTime += Time.deltaTime; Physics.autoSimulation = false; bool allSleeping = true; foreach( Rigidbody body in workList ) { if( body != null ) { allSleeping &= body.IsSleeping(); } } if( allSleeping || activeTime >= timeToSettle) { Physics.autoSimulation = cachedAutoSimulation; active = false; } else { Physics.Simulate(Time.deltaTime); } } } static void OnSceneGUI(SceneView sceneView) { if( active ) { Handles.BeginGUI(); Color cacheColor = GUI.color; GUI.color = Color.red; GUILayout.Label("Simulating Physics.", GUI.skin.box, GUILayout.Width(200)); GUILayout.Label(string.Format("Time Remaining: {0:F2}",(timeToSettle - activeTime)), GUI.skin.box, GUILayout.Width(200)); Handles.EndGUI(); foreach( Rigidbody body in workList ) { if( body != null ) { bool isSleeping = body.IsSleeping(); if( !isSleeping ) { GUI.color = Color.green; Handles.Label(body.transform.position, "SIMULATING"); } } } GUI.color = cacheColor; } } }

当了解了何时和为何使用网格、顶点吸附、碰撞吸附时,我们将在关卡设计工作流程获得更好的开发体验。推荐开发者们多多尝试这些工具,例如:对比轴心(Pivot)和中心(Center)模式的区别,或是比较全局(Global)和局部(Local)模式的不同,这样就可以知道什么模式更为适合。花费在布置虚拟对象的时间越少,那么在开发时得到的乐趣就越多。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解2016年09月02日00:00:36 \牧野(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fme.csdn.net%2Fdcrmg) 阅读数:59593
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这