Unity3D相关知识点总结

server/2024/12/22 16:01:24/

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.ppmy.cn/server/132223.html

相关文章

机器学习与神经网络的发展前景

目录 引言 1 机器学习与神经网络在各领域的具体应用和作用 2 展望机器学习与神经网络的未来 个人对机器学习与神经网络的看法 引言 在2024年,诺贝尔物理学奖破天荒地颁给了机器学习与神经网络领域的研究者,这一决定不仅震惊了科学界,也标…

前端vue部署网站

这里讲解一下前端vue框架部署网站,使用工具是 xshell 和 xftp (大家去官网安装免费版的就行了) 服务器 我使用的阿里云服务器,买的是 99 一年的,淘宝有新手9.9 一个月服务器。可以去用,学生的话是有免费三…

extern

1. 声明外部变量 现代编译器一般采用按文件编译的方式,因此在编译时,各个文件中定义的全局变量是相互透明的,也就是说,在编译时,全局变量的可见区域限制在文件内部。extern可以看到别的文件中的全局变量。 2. 在c中用…

2024年区块链钱包现状与未来趋势分析

钱包作为Web3世界的入口,充当了用户与区块链应用交互、管理资金和传递信息的关键工具。随着区块链技术的发展,钱包生态系统日益多样化,涌现出大量不同类型的解决方案。这些解决方案不仅极大地改善了用户体验,还推动了区块链技术和…

鹅厂JS面试题——0.1+0.2=0.3吗?

首先公布答案:在JavaScript 中,0.1 0.2 ≠ 0.3 为什么? JavaScript 中的数字使用 IEEE 754 标准的双精度浮点数(64 位)进行表示。这种表示方式在处理十进制小数时,不能精确地表示某些数字。比如0.1 和 0.2 这样的十进…

如何在Vue项目中封装axios

文章目录 一、axios简介基本使用 二、封装axios的原因三、封装axios的方法1. 设置接口请求前缀2. 设置请求头和超时时间3. 封装请求方法4. 添加请求拦截器5. 添加响应拦截器小结 一、axios简介 axios 是一个基于 XMLHttpRequest 的轻量级HTTP客户端,适用于浏览器和…

调用AI 通过相机识别地标

https://www.youtube.com/watch?vViRfnLAR_Uc&listPLQkwcJG4YTCRJxkPPDBcKqDWrfF5qanQs&index3学习视频 TensorFlow Hub 机器学习模型的代码库 找到地标模型 如何在Android上使用ts模型 https://blog.tensorflow.org/2018/03/using-tensorflow-lite-on-android.html…

Vue实现动态表单

使用 Vue 实现动态表单 在前端开发中,我们经常遇到根据用户输入动态生成不同表单项的需求。这类动态表单不仅提升了用户体验,还可以让复杂的交互流程变得简洁而高效。本文将详细讲解如何使用 Vue 3 的响应式特性,逐步构建一个递归动态表单。…