Unity笔记
2021-04-11 14:03:49 1 举报
AI智能生成
unity笔记
作者其他创作
大纲/内容
面试题
问题
脚本
脚本无法添加到物体上?
脚本是否编译报错? 有报错则改正错误,在尝试添加
看看是否文件名与类名不同? 不同则改为一致
类名一致,文件编译不报错 —>是否没有继承与Mono?
模型
导入的模型图片材质丢失?
点击预制体,选择材质(Materials)把Location改为use External Materials
导入的模型偏暗
点开模型的部分将材质类型改为Legcy shaders/Diffuse Fast
Unity文件夹一览表
常用
Scripts:代码文件夹
Sences:场景文件夹
特殊
Resources:项目资源文件夹
作用:编辑或者运行时都可以通过Rescources.Load()直接获取
功能:可以在根目录或者子目录,而且不管有几个,只要名字一样,都会被打包进.apk或者.ipa
Streaming Assets:只读非压缩文件
该文件下的资源也都会被打包进.apk或者.ipa,但是该文件不会被压缩,并且在程序运行时只能读不能写。
Plugins:插件目录
做手机开发时,一般Andiord或者ios要接一些SDK。可以把SDK依赖的 库文件放到这里
Editor:编辑区文件夹
该文件下的资源或者脚本不会打包进最终的发布包中,并且脚本也只能在编辑时使用。
Gizmos:Unity编辑时绘图目录
Editor Default Resources:编辑器默认资源文件夹
快捷键
知识点
1、游戏历史和unity概述
游戏引擎和unity发展史
3、3D模型基础
4、地形编辑器(Terrain)
对地形设置
抹平
柔化
对地形进行平滑处理, 如沙漠海滩湖边等等地方需要做平缓地形处理
其菜单与抬升基本一致 操作的同时按住 Shift可以进行反向操作
在创建一个地形后,应根据实际需要预先设置地形的大小以及高度,然后再对地形进行操作.
其菜单与抬升基本一致 操作的同时按住 Shift可以进行反向操作
在创建一个地形后,应根据实际需要预先设置地形的大小以及高度,然后再对地形进行操作.
地表细节
风力(Wind Zone)
5、光源
直线光(Directional Light)
可以照射无限的范围,一般模拟太阳光。
点光源(Point)
是从一个点向四周发射光,常用于灯泡等。
聚光灯(Spot)
在一个方向上,在一个光锥范围内照射一般用在手电筒,汽车灯等。
区域光(Area)
该类光源一般适用于光线烘焙,无法实时光照。
6、光照烘焙
实时全局光照(GI)
实时光照贴图预览(预烘焙)
光照烘焙
反射探针(Reflection Probe)
光照探头(light Probe)
光照预览窗口(Light Explorer)
7、音频
格式
Mp3:适合较长的音频,作为背景乐。
Ogg:适合较长的音频,作为背景乐。
Wav:适合较短的音频,作为环境音效。
Aiff:适合较短的音频,作为环境音效。
声音控制
声音的基本控制
音效与背景音乐的叠加及控制
声音、音效开关以及音量大小控制
8、unity脚本程序设计
unity C#脚本生命周期
Awake()当一个脚本实例被载入时Awake被调用, 无论脚本是否处于激活状态都调用一次;
OnEnable() 当脚本被设置为激活状态时掉用一次;
Start()仅在Update函数第一次被调用前调用;
FixedUpdate() 每隔固定时间间隔调用一次(默认0.02s),在0s时也会执行一次;
Update() 脚本处于激活状态时每帧调用一次;
LateUpdate() 在Update()之后调用一次;
OnGUI() 脚本处于激活状态时每帧调用两次(曾被用来渲染UI,推出UGUI之后几乎弃用);
OnDisable() 当脚本组件被设置为不可用时调用一次;
OnDestroy() 当脚本组件被销毁时掉用一次;
9、UI界面开发
开发方式分类
UGUI
NGUI
UI控件分类
基础控件
Canvas画布
Panel
EventSystem
Text
Image
Button
Button事件
高级控件
Toggle
Slider
Scrollbar
Scroll Rect复合控件
标签页面TabPage
布局管理控件
Horizontal Layout Group水平布局
Vertical Layout Group垂直布局
Grid Layout Group网格布局
10、动画系统
Animation
20、Mecanim动画系统
动画设置
type
None:无任何动画
legacy:旧版Animation动画
Generic:y一般动画
Humanoid:人形动画
动画重定向
步骤
先给人物角色绑定自己骨骼
然后在给角色设置动画状态机就可以了
BlendTree(混合树)
动画中添加事件和遮罩
动画IK(Inverse Kinematics)(反向运动学)
配置Avatar
问题
自动旋转
骨骼不匹配问题
Animator切换动画状态
切割动画
18、TimeLine和Cinemachine技术
TimeLine
倒放
Cinemachine虚拟摄像机
DOTween
常用方法
以DO开头的方法:补间动画的方法。例如:Transform.DOMoveX(10,1)
以Set开头的方法:设置补间动画的属性。例如:Tweener.SetLoops(4, LoopType.Yoyo)
以On开头的方法:补间动画的回调函数。例如:Tweener.OnStart(callBackFunction)
怎么制作人物动画?
建模软件制作的动画保存即可,没有专门的制作的插件,或者软件
11、物理模拟
概述
就是在虚拟的世界中运用物理算法对游戏对象的运动进行模拟,是的物理运动更加的符合真实世界的物理定律。
碰撞规则
两个对象发生碰撞必要条件是一个必须为刚体,另一个可以是刚体或者碰撞体
两个对象不光有碰撞还有力的“相互”作用,那么两个物体必须都是刚体。
刚体(Rigidbody)
定义:是指一个物体在受力的情况下,其外形和尺寸内部结构等都不受影响的的一种特性。
相对应的软体是指在受到力的情况下,其外形和尺寸等发生改变的物体。
相对应的软体是指在受到力的情况下,其外形和尺寸等发生改变的物体。
重要字段
Velocity
位移速度:this.GetComponent<Rigidbody>().velocity=Vector3.forward*10F;
centerOfMass
刚体重心。降低重心:this.GetComponent<Rigidbody>().centerOfMass=Vector3.up;
detectCollisions
碰撞检测开关。this.GetComponent<Rigidbody>().detectCollisions=false;//关闭碰撞检测
常用方法
rigidbody.AddForce(); 给刚体添加一个力,可以是力的形式,也可以是冲量的形式,添加力的大小对于刚体产生的影响很难把控,所以此类情况一般适用于模拟真实物理情况,比如 愤怒的小鸟。
rigidbody.MovePosition();让刚体移动至指定位置,以物理帧执行,想达到比较理想的效果应把
rigidbody.MovePosition(rigidbody.position + velocity * Time.fixedDeltaTime);写在FixedUpdate()里面。每一个物理帧都执行。
rigidbody.Sleep(); 让刚体处理睡眠状态
rigidbody.velocity; 给刚体赋值指定的速度,一般较适用于,需要对使用刚体的物体进行细微的速度控制。
12、碰撞体(Collider)和触发器
碰撞体
结论
<1>碰撞器(Collider)不需要刚体(Rigidbody)
<2>刚体(Rigidbody)要发生碰撞,一定需要碰撞器(Collider)
<3>碰撞器决定了碰撞发生时的边界条件
<4>刚体决定了碰撞发生后的物体的运动效果
<5>没有碰撞器的刚体,会在物理模拟中相互穿透。
触发器
结论
1、想要打印触发器方法,必须有一方是触发器,必须有一方带有刚体。二者缺一不可。
2、双方都是触发器,或者其中一方是触发器,另一方是碰撞器,都不会打印。
3、只要一方是触发器,并且有刚体组件,不管另一方是碰撞体还是触发器都会打印各自的触发器方法。
4、一般我们将触发器方法写在角色碰到的物体上,角色一般不参与触发方法。只写碰撞方法。
区别
<1>碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性。
<2>当IsTrigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数;
<3>当IsTrigger=true时,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数。
<4>如果既要检测到物体的接触又不想让碰撞检测影响物体移动或要检测一个物件是否经过空间中的某个区域这时就可以用到触发器。
13、unity2D技术
15、数据传值
脚本组件传值技术
类的静态字段传值技术
SendMessage数据传值技术
定义委托和事件进行传值
Action 委托
Playerprefs技术
Xml数据持久化技术
网络服务器端技术
16、3D数学
坐标系统
左右手坐标系
大拇指指向的方向就是Z轴的方向,四指弯曲的方向就是从X轴到Y轴的方向,左右手都可以这样判断。
世界坐标系
就是左手坐标系。
局部坐标系
就是相对于父亲对象的坐标系。
17、3D图形学
19、粒子系统(Particle System)
21、导航寻路
Navigation主要四个部分
NavMesh:导航网格,也就是可以进行寻路的区域
NavMeshAgent:导航网格代理,就是在导航网格(NavMesh)中进行移动的对象
NavMeshObstacle:障碍物,即代理需要绕开的对象,障碍物的周围没有导航网格
off-Mesh Link:离网链接,也就是两个导航网格之间的路径,一般显示是两个圆圈和一条有方向的弧线;
22、项目研发常用的优化策略
遮挡剔除
定义:当场景中包含大量模型时,会造成渲染效率降低(也就是FPS帧速率下降),使用遮挡剔除技术,可以使那些被阻挡的物体不被渲染,达到提高渲染效率的目的。
原理:在场景空间中创建一个区域,该遮挡区域有单元格组成,每个单元格构成整个场景的一部分,这些单元格会把整个场景拆分成多个部分,当摄像机能够看到该单元格时,表示该单元格中的物体会被渲染出来
层消隐距离技术
定义:如果场景中存在大量小“物件”,则可以使用“层消隐距离”来优化场景;”层消隐距离“就是在比较远的距离将小物体剔除,以减少绘图调用的数量(比如:可以一个大型场景中,高大型的物体任然可见,但是一些小装饰内容(小狗、车子之类的则可以隐藏))
层级细节
定义:层级细节(LOD),全称为Level of Detail;它是根据物体在游戏画面中所占的像素多少(所占游戏视图的百分比)来调用不同复杂度模型,简单地理解就是同一个物体离摄像机比较远时,使用复杂度低的模型,当物体离摄像机比较近时使用复杂度高的模型。
23、unity游戏移植与手指触控识别
24、软件重构思想
定义:在软件工程学中重构(Refactoring)就是在不改变软件现有功能的基础上,通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性。
重构就能够最大限度的避免这样一种现象。系统发展到一定阶段后,使用重构的方式,不改变系统的外部功能,只对内部的结构进行重新的整理。通过重构,不断的调整系统的结构,使系统对于需求的变更始终具有较强的适应能力,延长软件生命周期。
对软件的生命造成威胁的因素只有一个:需求的变更。一个软件总是为解决某种特定的需求而产生,随着时间的推移客户的需求总是会发生变化的,这就产生了一种糟糕的现象:软件产品最初制造出来,是经过精心的设计,具有良好架构的。但是随着需求的变化,必须不断的修改原有的功能、追加新的功能,还免不了有一些缺陷需要修改。为了实现变更,不可避免的要违反最初的设计构架。经过一段时间以后,软件的架构就千疮百孔了。bug越来越多,越来越难维护,新的需求越来越难实现,软件的构架对新的需求渐渐的失去支持能力,而是成为一种制约。最后新需求的开发成本会超过开发一个新的软件的成本,这就是这个软件系统的生命走到尽头的时候。
重构的好处
能改进软件设计使软件更容易被理解(布局、命名、注释、简化逻辑等)
能帮你找到bug
提高软件的开发速度(改进方法,为后继开发提供优势)
什么时候对软件重构
在添加新功能时进行重构。
在修改bug时进行重构。
在代码复审时进行重构。
什么情况下对软件重构
带复杂条件逻辑的程序:方法过长,逻辑过于复杂,错误率直线上升,可读性直线下降;过大的类,往往是类抽象不合理的结果,降低了代码的复用性;
逻辑重复的程序: 一个类中存在相同的代码块,提炼为宜个独立方法;不同类中有相同的代码块,提炼为一个新类;
过渡耦合的程序:修改或增加一个小功能修改修改大量的代码;
难以阅读的程序:糟糕的命名方式,排版、注解;
当现有的程序无法运行,或重构成本已经超出重写成本时应该是重写程序,而不是重构程序
等等...
软件重构的原则
25、射线
定义:射线是3D世界中一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射 。
用途:射线多用于碰撞检测(如:射击游戏里是否击中目标)、角色移动、判断是否触碰到3D世界中的哪些物体对象,进而操作等。
基础API
Ray 射线类
Ray Camera.main.ScreenPointToRay(Vector3 pos)
Ray Camera.main.ViewportPointToRay(Vector3 pos)
RaycastHit 光线投射碰撞信息
bool Physics.Raycast(Vector3 origin, Vector3 direction, float distance, int layerMask)
bool Physics.Raycast(Ray ray, Vector3 direction, RaycastHit out hit, float distance, int layerMask)
bool Physics.Raycast(Ray ray, float distance, int layerMask)
bool Physics.Raycast(Vector3 origin, Vector3 direction, RaycastHit out hit,float distance, int layerMask)
RaycastHit[] RaycastAll(Ray ray, float distance, int layerMask)
layerMask
26、数据持久化
PlayerPrefs
优点
适合中小项目对少量数据的存储要求
XML
优点
XML是一种格式严谨且容易阅读的数据存储格式,更加容易理解与排错。
XML是一种数据交换的标准,目前几乎任何一种语言都可以读/写XML文件格式。所以具备天然的跨平台性;
XML可以对象序列化与反序列化,更加容易与项目中的“实体对象”结合,持久化数据更容易与自然,适合大量、复杂结构对象的存储要求。
序列化和反序列化
反序列化
它将流转换为对象。
序列化
序列化是将对象状态转换为可保持或传输的格式的过程。
Json
JSONObject
提取数据时转换
.str是字符串
.n是整数或者小数
ListJson
Excel文件转换为JSON文件
MySql
Mysql.Data.dll官网下载
Unity如何查看 .NET 版本
VsCode连接mysql
27、预加载与对象缓冲池技术
对象池
预加载
28、网路技术
线程、协成和进程
进程和线程
进程
就是一个系统中正在运行的一个应用程序。
线程
就是系统分配处理器时间资源的基本单元
多线程的运行最基本的特点时:无规律的同时运行。
一个进程可以有一个或者多个线程
线程类Thread
控制方法
Start();开始
Abort();终止
Join();阻塞
Sleep();休眠
常用方法
System.Threading.Thread.Sleep(1000); 所有线成都停顿1秒
System.Threading.Thread.CurrentThread.Join(1000);当前线成停顿1秒;
优先级
Highest
AboveNormal
Normal(默认)
BelowNormal
Lowest
常见问题
线程同步
就是解决当多个线程访问一个资源时可能出现的问题
利用锁的概念lock(){}就是对某个对象进行锁定,当访问该结构体时会检测是否上锁,来判断是否继续访问
14、协程和调用函数
协程
调用函数
void Invoke(string methodName,float time);
void InvokeRepeating(string methodName,float time,float repeatRate);
void CancelInvoke();
bool Isinvokeing(string methodName);
套接字Socket技术
29、AssetBundle资源动态加载
30、AssetBundle框架设计
Steam VR
按键
插件
easytouch
手指触摸时使用
NGUI
广告
Google AdMobe
步骤
注册账号
登录
进入Monetize
创建App
创建Ad unit(注意 Ad unit ID)
下载unity插件导入
在代码中调用广告
UnityAds
添加unityAds步骤
下载广告插件并导入unity
注册并登录unityads账号
添加游戏并获取游戏ID
在脚本中引入命名空间using UnityEngine.Advertisements;
初始化广告Advertisement.Initialize("<广告id>");
展示广告if(Advertisement.isReady(){Advertisement.Show();})
支付
Bmob(支持个人开发)
产品
iOS和Android云数据库
iOS和Android支付
iOS和Android聊天组件
Cocos2d-x SDK云数据库
Unity云数据库
Android推送
iOS和Android短信
JavaScript SDK云数据库
步骤
unity和Android通信
下载Android开发工具
Android Studio下载developer.android.com(创建Android工程)
JDK
利用Android Studio创建Library Module(库模块)
在Android工程下分很多Module,每个Module可以创建一个Android的应用
导入classes.jar(位于unity安装目录)
把创建好的工程按照正确的结构导入unity中
真机测试
Android中创建支付接口
在unity中创建支付商店,利用跟Android通信技术,调用支付接口
360
腾讯应用宝
百度手机市场
动画
DOTween
DoTweenPath(路径编辑器)
DoTweenAnimation(可视化编程)
Tweener
Do(动画的播放)
DOKill();播放完毕销毁动画
DoPause();停止播放
Doplay();播放一次动画
DOPlayBackwards();倒放动画
DOPlayForward();向前播放动画
DORestart();重新播放动画
DORewind();
DOTogglePause();动画播放的开关
DOTween.To(()=>myValue,x=>myVaule=x,new Vector3(10,10,10),2);插值的方式区改变myvalue的值,前面的两个参数用的是Lambda表达式
DOMove(TargetValue,time);世界坐标
DOLocalMove(TargetValue,time));局部坐标
DOText(string text,float time);显示对应的文字
当text有文字时就会覆盖之前的文字
当没有文字时就是一个一个字的出现
DOColor();渐变到某个颜色
DOFade();
设置Alpha(透明度)值
0是隐藏1是显示
DOShakePosition(time,vector3);
time是震动的时间
vector3是震动的范围
Set(设置属性)
SetEase(Enum Ease);设置动画曲线
子主题
Set Loops();循环的次数
SetAutoKill();设置是否销毁
on(生命周期方法)
OnComplete(methodname);动画结束事件,播放完成后调用methodname
OnStepComplete(methodname);
OnKill();当动画被销毁时事件
OnStart();当动画第一次播放时
OnPlay();当动画每次开始播放事件
OnPause();当动画暂停
OnRewind();当动画重置
From Tweens
就是正DOTween的动画方法后面加上From();就表示动画反过来播放
From(bool);
参数为true就是相对的位置,就是相对于当前位置移动多少
参数为false就是绝对位置,就是移动到那个位置
教程
HOTween
LeanTween
GoKit
iTween
游戏框架
常见的知识点
如何设置游戏对象在场景切换时不销毁
DontDestroyOnLoad 的缺陷和解决办法
异步加载
0 条评论
下一页