当前位置: 首页 > article >正文

Unity3D相关知识点总结

Unity3D使用的是笛卡尔三维坐标系,并且是以左手坐标系进行展示的。

1.全局坐标系(global)

全局坐标系描述的是游戏对象在整个世界(场景)中的相对于坐标原点(0,0,0)的位置。我们在场景中创建一个cube,初始的position值为(0,0,0),表示它当前在原点位置,如果我们设置它的position属性值为(1,2,3),则此时表示,cube相对于世界原点在x轴上偏移了1个单位,在y轴上偏移了2单位,在z轴上偏移了3个单位(注:unity中单位为米,即每单位为1米)。

 2.局部坐标(local)

场景中的游戏对象都有属于自己的独立坐标系,也称为模型坐标系,通过切换工具栏中的global按钮就可以切换全局/局部坐标系。我们新建一个cube,在inspector面板中修改rotation属性的y轴为200,这时切换全局/局部坐标系按钮,我们发现全局坐标系和局部坐标系不一致了。如果觉得不好理解,我举个形象的例子,比如用导航软件,我们这里先将指南针正北方向规定为世界坐标的正方向,当导航软件提示我们向左转,我们向左转,这时我们自身的方向变化了,但是世界坐标的正方向还是原来的正北,并没有因为我们的自身左转而改变指南针的正北方向,左转就是局部坐标系的概念,当导航软件提示我们向北直行时,向北就是世界坐标系的概念了。

如果我们再新建另外一个cube,并且将其中一个拖动到另一个cube上组成父子关系,这时,父节点的cube的坐标就成为了子节点cube的原点了,子节点的移动则是相对父节点的偏移。当我们将子物体的position属性设为(0,0,0)时,子物体就和它的父节点重合了,我们设置子物体的position属性为(0,-2,0)时,子物体在y轴上相对于父节点向下偏移了2个单位。

 3.屏幕坐标系:

以像素来定义的二维坐标系,用以描述像素在屏幕上的位置,屏幕的左下角定义为原点(0,0),右上角则为Game窗口的宽和高值组成的二维坐标点,可以用unity对应的屏幕api表示(Screen.width,Screen.height),z轴的大小根据相机在世界坐标的位置来定义。鼠标的位置坐标,得到的就是屏幕坐标。屏幕坐标的数值只跟Game窗口的大小有关,跟分辨率没有关系。下图通过截图软件标识了左下角的(0,0)坐标。

 4.视口坐标

视口坐标是标准化后的屏幕坐标,视口标准化(或者叫归一化)概念跟向量的归一化类似,向量的标准化即通过计算让向量的长度为1,类似的,视口坐标以0到1之间的数来表示,它的范围是以相机视口的左下角为(0,0),右上角为(1,1)定义的一个矩形。如果我们希望一个物体能被看到,那么它就需要被转换到视口坐标。理解视口坐标可以参照屏幕坐标,z轴与屏幕坐标一样,我们看视口矩形框时,z轴指向我们,z轴为正方向,z轴的值为摄像机的世界坐标取反。如下图,就是摄像机的视口。

各种坐标的转换方法:

世界和本地坐标的互转,直接取unity的transform的接口即可,取世界坐标用的position,取局部坐标用localpoistion。

屏幕坐标转为世界坐标:使用camera.screentoworldPoint(vector3 v),camera为场景中的场景相机实例,此api常用于射击游戏的子弹发射、战略游戏或者角色扮演游戏中的点击地面移动角色。

世界坐标转为屏幕坐标,使用camera.worldtoscreenpoint(vector3 v),camera为场景中的UI相机实例,比如我们需要在怪物的头上挂一个血条,就可以使用场景相机将世界坐标转为屏幕坐标,然后再用UI相机将屏幕坐标转为世界坐标,最后赋值给UI控件。

屏幕坐标转为视口坐标,使用camera.screentoviewportpoint,camera为场景中场景相机。视口坐标请参照屏幕坐标。

世界坐标转为视口坐标,使用camera.worldtoviewportpoint,camera为场景中场景相机。

屏幕坐标转ugui坐标,当canvas的渲染模式(render mode)为screen space overlay时,直接将屏幕坐标赋给目标物体的transform.position(注意不是localposition)。当渲染模式为screenspace camera时,会出现因深度值不正确而引发的问题,这时应该使用RectTransformUtility.ScreenPointToWorldPointInRectangle方法将屏幕坐标转为世界坐标后再赋给transform.position。

Unity的话主要还是分两块吧,第一块是美术(自己都不懂~这里允许我稍微带过一下吧~),美术的话主要包括3d模型、材质、纹理(贴图)这几部分吧,当然你也可以说还有shader(着色器),Unity本身拥有几十种shader,也可以根据自己的需要使用shaderLab语言来编写shader,这个对我来说相当有难度,所以一般只用Unity自带的和网上“流传”的。

接下来是程序方面的:

基本组成:

Scene场景,类似于Flash中的stage,用于放置各种对象。

GameObject,可以携带各种Component(每个GameObject至少带有Transform组件,所有的组件都可以从顶部菜单Component里面找到并添加给游戏对象)。

Component组件,附加在GameObject上,不同的组件可以使GameObject具有不同的属性,Transform、碰撞器、刚体、渲染器等都是组件,脚本也是组件的一种,对象所表现出来的行为都是由组件实现的。

脚本语言:

C#、Javascript、boo(前两者使用较为广泛,网上教程以前两者为主,个人推荐c#),一般的继承MonoBehaviour类的脚本都需要依附的场景中的对象上才能被执行。

用户图形界面部分(GUI):

  • 用于制作按钮、文本显示、滚动条、下拉框等常用图形操作界面元素,使用GUISkin和GUIStyle可以自定义样式)
  • 系统自带GUI
  • 各类GUI插件,NGUI、EZGUI等。

预制:

  • 用于程序运行时,动态实例化对象的“母体”,比如,在射击类游戏中,子弹的生成就可以使用实例化预制的方式来实现,这就好比是Flash中的各种Display类,你可以定义它的各种属性方法,然后在使用的时候直接实例化一个实例。
  • 在project面板右击选择Creat——Prefab新建一个预制,将Hierarchy面板中要制成预制的对象拖到这个新建预制上即可。

标签和层:

  • 标签(tag)用于辨别物体,与name类似,使用对象的tag和name都可以找到对应的物体 (GameObject.Find(“Name”)、 GameObject.FindWitnTag(“Tag”))。默认是Untagged,可以通过Inspector面板里面Tag的下拉菜单选择 Add Tag项来添加新的标签, 在tagmanager中点开Tags左侧的小三角通过size来增加标签的数量,每个Element内都填入新标签的名字
  • 层(layer),在使用某些功能的时候,可以通过层来过滤不 需要运用该功能的对象,也就是把该功能运用到特定的层,比如,相机的Culling Mask属性,通过选择特定层可以实现只显示位于被选中的层的对象。层的添加也是在标签管理器中,Unity已经设置了8个层,你是不能对这8个层进行修 改的,你可以从第9个(也就是user layer8)开始添加你定义的层。

http://www.kler.cn/news/341811.html

相关文章:

  • Python从入门到高手6.1节-字符串的定义与编码
  • 车载电源OBC+DC/DC
  • 25西安电子科技大学考研预报名人数信息—公布
  • OmniPlan Pro for Mac 项目管理流程软件安装教程【保姆级教程,简单小白轻松上手】
  • 机器学习中的熵(Entropy)是什么?
  • 修改 antd a-popover气泡卡片弹窗背景颜色
  • 代码随想录算法训练营第四十六天 | 647. 回文子串,516.最长回文子序列
  • Python 工具库每日推荐 【Matplotlib】
  • 需求9——通过一个小需求来体会service层的作用
  • ubuntu下载gitee库源码
  • 代码随想录day29:动态规划part2
  • 备份python运行环境
  • vue3中使用live2D
  • Echarts 图表导出为 SVG矢量图
  • 毕设 大数据电影数据分析与可视化系统(源码+论文)
  • RabbitMQ入门5—exchange参数之durability
  • 前端背景图裁剪
  • 【kubernetes】环境准备及K8S二进制安装【最新最全】
  • 古典舞在线交流:SpringBoot平台实现与优化
  • Leetcode 3312. Sorted GCD Pair Queries