Unity3D相关知识点总结

ops/2024/10/11 5:09:03/

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/ops/123818.html

相关文章

毕设---中国移动网站平台管理系统的设计与实现

本系统采用技术 采用J2EE框架(Struts 2、Spring、iBATIS) iBATIS,FreeMarker,Lucene,Struts 2等技术 毕业论文—任务书 毕业设计基本内容和要求: 基本要求本毕业设计要求学生通过实习工作,让…

RelationGraph实现工单进度图——js技能提升

直接上图: 从上图中可以看到整个工单的进度是从【开始】指向【PCB判责】【完善客诉】【PCBA列表】,同时【完善客诉】又可以同时指向【PCB判责】【PCBA列表】,后续各自指向自己的进度。 直接上代码: 1.安装 1.1 Npm 方式 npm …

第十二章 Redis短信登录实战(基于Session)

目录 一、User类 二、ThreadLocal类 三、用户业务逻辑接口 四、用户业务逻辑接口实现类 五、用户控制层 六、用户登录拦截器 七、拦截器配置类 八、隐藏敏感信息的代码调整 完整的项目资源共享地址,当中包含了代码、资源文件以及Nginx(Wi…

《Electron 基础知识》设置 Vue 中引用的文件路径别名

vite.renderer.config.mjs 文件中配置 代码第1行,引入 resolve ;代码第 6 - 10 行,设置路径别名,注意没有后缀 /; import { resolve } from pathexport default defineConfig((env) > {return {resolve: {alias: …

Java LeetCode 每日一题

3162. 优质数对的总数 I package JavaExercise20241010;public class JavaExercise { }class Solution {public int numberOfPairs(int[] nums1, int[] nums2, int k) {int sum 0;int length1 nums1.length;int length2 nums2.length;for (int i 0; i < length1; i) {f…

免费气象可视化的前端框架概述

用于气象可视化的前端框架&#xff0c;通常需要具备处理大规模数据、交互性和动态更新的能力。以下是一些适合气象数据可视化的前端框架&#xff1a; 1. D3.js 简介: D3.js 是一个非常流行的 JavaScript 数据可视化库&#xff0c;可以将气象数据转化为交互式图表和地图。它非…

【Flutter】- 核心语法

文章目录 知识回顾前言源码分析1. 有状态组件2. 无状态组件3. 组件生命周期4. 常用组件Container组件Text组件Image组件布局组件row colum stack expandedElevntButton按钮拓展知识总结知识回顾 【Flutter】- 基础语法 前言 Flutter是以组件化的思想构建客户端页面的,类似于…

关于相机的一些零碎知识点

热成像&#xff0c;英文为Thermal Imaging&#xff0c;例如型号500T&#xff0c;其实指的就是热成像500分辨率。 相机的CMOS&#xff0c;英文为Complementary Metal Oxide Semiconductor&#xff0c;是数码相机的核心成像部件&#xff0c;是一种互补金属氧化物导体器件。 DPI…