unity学习笔记
阿发你好教学视频:http://www.afanihao.cn/
Unity游戏开发-3D基础教程
https://study.163.com/course/introduction.htm?courseId=1210941808&_trace_c_p_k2_=f1a550eab8fa4c6fa1aefa6c7414cb5a
unity 零基础入门教程
https://study.163.com/course/introduction.htm?courseId=1210853806#/courseDetail?tab=1
UGUI教学视频
https://edu.51cto.com/center/course/lesson/index?id=46977
unity官网:https://unity.cn
VS2017 快捷键修改,修改注释
https://blog.csdn.net/sinat_28442665/article/details/83998150
修改ctrl+y删除行:
工具,选项,键盘,输入编辑 删除行找到ctrl+shift+L(这是默认删除行)分配一个ctrl+y
VS2017设置sublime主题
https://blog.csdn.net/sidnee/article/details/83316978
**.1**
了解几个窗口/面板
Project 项目面板 :项目内的资源文件
Scene 场景视图:以可视化的形式展示游戏内容
Game 游戏视图:对游戏进行播放预览
Hierarchy 层级面板:以树状形式显示游戏中的对象
Inspector 属性面板:显示资源和游戏对象的属性
Console 控制台: 用于游戏代码的打印输出调试
1 unity中 1unit表示一个单位,表示100像素
postion都是以unit为单位的
2 矩形工具按住shift可以等比缩放,沿着对角线稍微往外移动一下就可以进入旋转模式
在2D游戏中的旋转,指的是对Rotation Z轴的旋转
Pivot轴心,Local本地坐标
3 摄像机的Z是负值是在外面的,Z轴是往里的,所以Main Camera的Z轴是负数 -10默认 不用改
摄像机的backgroud是场景的背景,默认是蓝色
摄像机的几个参数:
Z 坐标,默认-10 ,不用修改
Background ,默认蓝色,游戏运行时的背景色
Size 广角,指摄像范围,默认5个单位
其中,5 Unit 为半高,全高为 5 * 2 = 10 Unit
4.
Game窗口的 Free Aspect 表示自由比例 4:3,16:9 表示屏幕长宽比
在准备背景图片时
1 摄像机 Size = 5 size是半高,全高就X2 = 10
图片高度: 10 Unit * 100 = 1000 px
图片宽度: 按 16:9 准备,最好更宽一些,以覆盖更宽屏幕 高度是1778
2 摄像机 Size = 3.6
图片高度: 7.2 Unit *100 = 720 px
图片宽度: 应比 1280 略大一些,以覆盖更宽屏幕 16:9的话就是1280
5.
在 Inspector 里,勾选 Active 复选框
设置长宽比
在 Game 窗口里,将长宽比设为 16:9
6.
在2D画面中,两个对象如果重叠,谁显示在上面呢?
办法1 :修改 Order In Layer ( 推荐 ) 值越小越显示在下面
办法2 :修改 Z 坐标
1 即使一个对象被遮住,也是可以操作的
2 Hierarchy窗口中的先后顺序,并不能决定显示顺序
7.
Unity 显示对象默认轴心(锚点)是中心点
Sprite Renderer是显示图片的组件,Flip是翻转,x是水平翻转,y是竖直翻转
每个 GameObject ,都必须有一个 Transform 组件,不能删除
在后面的脚本编程中,Transform组件是最常用的
Transform ,一个基本组件
表示:
- Position 位置
- Rotation 旋转
- Scale 缩放
8
给游戏对象挂载脚本,然后点击play按钮开始运行,再次点击停止运行
如果是蓝色底色的话就是正在运行,如果是灰色底色的话就是没运行
点一下play,大概需要2秒钟才能变成蓝色正在运行
先停止游戏,再修改,否则无法保存提示 you must exit play model tosave the scene
9.
必须继承于 MonoBehaviour
所有 Unity 脚本都继承于这个类
默认定义了一些事件函数
如 Start() , Update() ,会被 Unity 引擎自动调用
事件方法 Event Function ,约定好的一些事件回调
例如,
Start() 每次开始时调用一次
Update() 每帧调用、更新游戏显示
Start() 开始调用一次,可用于初始化
Update() 每帧调用,帧间隔不等,可用于更新游戏
还有更多的事件方法,如Awake(), OnEnable() …
Time.deltaTime() 获取上一次Update() 到现在的时间间隔
内部执行顺序:
1 创建游戏对象
2 创建组件
比如 Hello comp = new Hello();
3 comp.Start()
4 定时执行 comp.Update() 更新游戏显示
在 Update() 里移动小飞机,每次向上移动 0.05 单位
this.transform.Translate(0, 0.05f , 0);
this.transform 即当前游戏对象的 transform组件
Translate() 调整相对位移
匀速移动的优化:
float step = 0.8f * Time.deltaTime;
其中,
0.8f 表示每秒位移 0.8 单位
Unity 中一般使用 float ,而不是 double
所以在指定参数时要以 f 结尾 ,例如 0.8f
VS快捷键教程
删除或剪切一行(Ctrl + X)
格式化整个文档(Ctrl + K, Ctrl + D)
智能感知(Ctrl + J)
折叠所有方法 (Ctrl+M,Ctrl+O)
折叠或者展开当前方法(Ctrl+M,Ctrl+M)
查看函数参数 (Ctrl+K, Ctrl+P)
注释(Ctrl+K, Ctrl+C)
在光标下面插入空行(Ctrl+Shift+Enter)
插入代码段(Ctrl+K, Ctrl+S)
this可以省略
SpriteRenderer spr = this.GetComponent<SpriteRenderer>();
spr.flipY = true;//翻转
10.
可以获取场景内的任何节点 (游戏对象 ) ,以下它下面的组件
按名字来获取节点
GameObject obj = GameObject.Find("/path/of/target");
再获取它下面的组件
SpriteRenderer comp = obj.GetComponent<SpriteRenderer>();
11.
查看 MonoBehaviour 文档
enabled , 此组件是启用 / 禁用
gameObject, 当前游戏对象
transform , 当前Transform组件
name, 当前游戏对象的名称
查看 Transform 的文档,它的两个作用:
用于设置 Position / Rotation / Scale
用于维持父子节点关系
很多从cocos2d-x转unity3d的朋友会面对unity3d中的父子关系不知所措,所以就稍微提下
,unity3d中的父子关系是由transform中的parent决定的,没有常用的addChild操作
GameObject obj = GameObject.FindGameObjectWithTag ("MainCanvas"); //取得画布
GameObject newNode = Instantiate (Resources.Load("Prefab/node")) as GameObject; //创建一个节点
newNode.transform.parent = obj.transform; //将新建节点的父节点设为画布
一级节点的 transform.parent 为 null
在游戏运行时,Hierarchy 和 Inspector 显示的实时数据,停止游戏后又回归初始状态
12.
transform.eulerAngles = new Vector3(0, 0, 45f);//欧拉角度
旋转后,xy轴跟着旋转,
void Update()
{
transform.Translate(0, speed * Time.deltaTime, 0);
}
不用调整,xy坐标即可实现斜着运动
13.
transform.Translate( dx, dy, dz) 用于实现相对运动
即,在原位置上偏移 dx, dy, dz 的距离
比如,沿 Y轴 方向移动 0.02单位
transform.Translate(0, 0.02f, 0, Space.Self);
其中,Space.Self 表示使用‘小飞机’自己的坐标系
Space.Self 使用自己的坐标系 ( 默认值 )
Space.World 使用世界坐标系
Translate() 是相对运动,飞行是一直沿‘机头方向’飞行的
14
标准化 Normalize,就是把向量的长度缩放成1,即单位向量
几个常用的标准向量 (静态常量)
Vector3.right ,即 Vector3 (1, 0, 0)
Vector3.up , 即 Vector3 (0, 1, 0)
Vector3.forward ,即 Vector3 (0, 0, 1)
C#变长参数方法
static void ParamsMethod(params int[] list)
{
for (int i = 0; i < list.Length; i++)
{
Console.WriteLine(list[i]);
}
Console.ReadLine();
}
ParamsMethod( 25, 24, 21, 15);//调用
15
unity 图片添加点击事件监听
https://blog.csdn.net/jiumengdz/article/details/103566613
16
//Input.GetMouseButtonDown(0) 检查鼠标按下事件
//Input.GetMouseButtonUp(0) 检查鼠标抬起事件
//Input.GetMouseButton(0) 检查鼠标状态(是否是按下状态)
//其中,0代表左键,1为右键,2为中键(滚轮)
//Input.mousePosition 代表此时鼠标的位置(屏幕坐标 )
事件函数 Event Functions
常见的几个:
Awake() - 脚本组件实例化时
OnEnable() - 脚本组件启用时
Start() - 脚本组件第一次执行之前
Update()
FixedUpdate()
不以 On 打头的,由系统主动调用
Awake() , Start(), Update(), FixedUpdated()
以 On 打头的,是相应事件的回调函数
OnEnable(), OnDisable (), OnGUI() …
演示: 添加 Awake() 、OnEnable() 、Start() 的实现
比较:
1 当组件被禁用时,[属性面板上对勾去掉]Awake()被调用,OnEnable(),Start()不被调用
2 Start() 只会调用一次
3 OnEnable() 在每次启用时调用
一般情况下,可以把初始化写在 Awake() 或 Start() 里
游戏里有多个脚本组件时,执行的顺序是怎样的?
脚本执行顺序是:
有父子节点:先子脚本,再父脚本
兄弟节点:跟 Hierarchy 层级无关,并没有明显的规律。。。
用伪代码表示如下:
for( Script s : sss ) {
s.Awake(); // 先对每一个组件,调用 Awake()
}
for( Script s : sss ) {
{
s.Start();
}
UnityFrame() {
for( Script s : sss ) s.Update()
}
执行顺序的设定:Project Settings | Script Execution Order
顺序值越小,则越优先。
比如,将一个脚本的 Execution Order 设为 -1 ,则它将优先执行
若想让一个脚本先于其他脚本,则将执行顺序设为 -1
若想让一个脚本最后执行,则可以将执行顺序设为 1
其他脚本,没有特别要求的,不要设置顺序
Instantiate() 重载了很多版本,常用的如下:
bullet = Instantiate(myPrefab)
创建一个实例,position与rotation与当前游戏对象相当,挂载场景根节点下
bullet = Instantiate(myPrefab, Transform parent )
创建一个实例,position与rotation与当前游戏对象相当,同时指定父节点
bullet = Instantiate(myPrefab, position, rotation)
创建一个实例,挂载场景根节点下,同时指定 position与rotation
例如,
bullet = Instantiate(myPrefab, transform.position, transform.rotation)
bullet = Instantiate(myPrefab, position, rotation, Transform parent)
创建一个实例,挂载 parent 节点下,同时指定 position与rotation
17
Input.GetKeyDown ( key ) 键盘按下事件
Input.GetKeyUp ( key ) 键盘抬起事件
Input.GetKey ( key ) 状态检查,某键是否被按下
例如,检查 左箭头 是否被按下
if ( Input.GetKey( KeyCode.LeftArrow ) ) {
}
18 刚体
mess:质量 (默认1千克)
刚体 RigidBody ,指物理系统中的物体
具有质量、速度
演示:给‘苹果’增加一个 RigidBody 2D 组件,运行游戏。。Physics是3D刚体
Add Component | Physics 2D | RigidBody 2D
刚体有三种类型:
Dynamic 普通刚体,有质量、有速度
Static 静态刚体,质量无穷大、无速度
( 适用于建筑物、地面等固定不动的物体)
Kinematic 运动学刚体,无质量
( 忽略物理规律的刚体,一般用于碰撞检测 )
材质:Bounciness是弹性 设置成1
刚体的反弹,在物理中需要一个弹性系数
1 在Project窗口里,Create | Physics Material 2D ..
Friction : 摩擦系数
Bounciness : 弹性系数 , 设为1
2 选择皮球的 Rigidbody 2D组件
Material:选择上述材质
3 运行游戏,观察皮球的反弹
19
本章介绍‘碰撞检测’ 技术
有两种碰撞检测:
- 物理学的碰撞检测, Dynamic 刚体 受重力影响
- 运动学的碰撞检测, Kinematic 刚体 不受重力影响
飞机和子弹都需要加刚体Kinematic和碰撞组件collider
所以,我们可以推断出,如果两个碰撞体都没有刚体组件,那么这两个物体即使相互发生了碰撞,那么也不会有碰撞事件的。
从上面的图中我们看出来碰撞的双方中一定要有一个Rigidbody存在,并且碰撞双方必须都要有碰撞体组件。
就是发生碰撞的主体一定是要带刚体的,即只有带刚体的碰撞体去撞其他碰撞体时,双方才会收到碰撞事件
得出的结论似乎是如果碰撞双方只有一个有刚体,那么那个刚体一定要处于运动的状态下才会有碰撞事件发生。
一般 Rigidbody2D 和 Collider 2D 同时出现,组合使用
碰撞事件回调,有三个:
OnTriggerEnter2D :两个碰撞体开始相遇
OnTriggerStay2D : 两个碰撞体接触中
OnTriggerExit2D: 两个碰撞体分开
碰撞事件的参数: Collider2D collision ,表示的是对方的碰撞体组件
例如,
collision.gameObject 对方
collision.transform 对方的Transform组件
collision.name 对方节点的名称
collision.tag 对方节点的Tag
20
有些不必要的碰撞事件,是可以规避的 ( 不检测 )
使用 Layer 来管理碰撞,可以减轻系统的运算消耗
对比一下效率:
1 使用Tag:碰撞已经检测到了,只是没有做处理
2 使用Layer Collision Matrix:没有检测,直接忽略
层 Layer ,也可以来管理游戏中的物体
比如,
建筑物
玩家
敌人
NPC
宝物 …
碰撞矩阵:规定谁和谁可以产生碰撞,谁和谁的碰撞被忽略
Edit | Project Settings | Physics 2D …
面板的最下方,找到 Layer Collision Matrix …
21.
音频素材,支持的格式 : mp3 / wav / ogg / aiff
在 Unity 中,加入声音素材,可以在 Inspector 中试听
在代码中,调用 AudioSource 的 API 播放
clip / mute / loop / volume / isPlaying
Play() 播放
Stop() 停止
Pause() 暂停
PlayOneShot( clip ) 新开一个播放
22.
Invoke 延时调用,就是过一会儿再调用
比如,
Invoke ("SomeJob", 3)
表示在3秒之后再调用 SomeJob() 方法
InvokeRepeating( methodName, delay, interval) :延时调用、并重复执行
即实现了一个定时器逻辑
第1种办法:
GameObject main = GameObject.Find("游戏主控")
MyGame myGame = main.GetComponent<MyGame>();
myGame.AddScore();
第2种办法:
GameObject main = GameObject.Find("游戏主控");
main.SendMessage("AddScore", 1);
SendMessage( ) : 查找目标方法并立即执行
1 遍历该对象上的所有MonoBehaviour组件
2 检查该组件上有没有 XXX 方法
3 如果有此方法,则执行该方法
若目标方法未找到,则提示 SendMessage XXX has no receiver!
1 虽然名字叫 Message ,但是并不存在所谓的‘消息’
2 SendMessage() 是同步调用,不是异步调用
在目标对象上,查找目标方法并立即执行
23.
UI ,User Interface 用户交互界面
Unity游戏中的UI,称为 UGUI
UI 层不属于游戏空间,而是浮在屏幕之上
24.
演示:在 Canvas 下添加一个 Button
Image组件,负责背景图片/颜色
Button组件,负责行为响应
Text组件,负责 文本的显示
Transition 设为 Color Tint ,表示普通的颜色按钮
演示:。。
Transition 设为 Sprite Swap,表示图片按钮
演示:。。
25.
UI里面 x,y位置是以像素为单位的
对于 UI 元素,都有一个 Rect Transform 矩形变换组件
RectTransform 是 Transform 的子类
Rect Transform 的定位:
1 默认是居中定位
2 Pos X/ Y, Width/Height 的单位是像素
3 改变Game 窗口大小,Text与Canvas中心的距离是不变的
26.
把游戏调整竖屏模式:
1 界面布局 Window | Layout | Tall
2 把分辨率设为 9 : 16 ,参考《图文教程》
3 摄像机高度 size=5
float dy = speed * Time.deltaTime;
transform.Translate(0, -dy, 0);
//translate也是移动位置,只不过是相对移动罢了,和obj.y-=dy是一个道理
Debug.Log("怪物的位置:"+transform.position);
27.手把手教你在unity导出安卓安装包(apk)
https://www.bilibili.com/video/BV1Ls41197KU?from=search&seid=10899024519695353041
Unity中用于Android的Gradle构建失败,说它无法找到intellij-core.jar
http://www.cocoachina.com/articles/417339
unity2019 build gradle failed解决办法
https://jkchen.blog.csdn.net/article/details/107182562?utm_term=unity%E4%B8%AD%E7%9A%84gradle%E7%89%88%E6%9C%AC&utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~sobaiduweb~default-2-107182562&spm=3001.4430
28.
GameObject.find和obj.transform.find的区别
第一个返回值是一个GameObject类型的,第二个返回值类型是Transform 类型的
GameObject.find active=false就找不到,递归查找
obj.transform.find 忽略激活状态都能找到,但是不递归查找
29.
UI字体在720*1280下设置的大小,在1080*1920的手机上显示字体太小怎么办?
在CanvasUI的Canvas Scaler属性里将Ui Scale Mode属性设置为Scale With Screen Size,
表示Canvas会根据屏幕比例缩放即可适配。
Canvas的 render Mode
ScreenSpace-Overlay表示摄像机和UI没有关系,UI将永远出现在所有摄像机的最前面
ScreenSpace-Camera才有关系,它支持在UI前方显示3d模型与粒子系统
WorldSpace 这个就是完全3D的UI,把UI也当作3D对象了
1和2用的最多
UI只能放在Canvas里面
Canvas Scaler 第一项是固定分辨率,第二项根据屏幕大小,下面的
Reference Resoluation是参考分辨率的意思
**31.**
- Text控件
大<color="red"><size=20>家</size></color>上午好
Horizontal Overflow:水平溢出
(1)Wrap:文本将自动换行,当达到水平边界
(2)Overflow:文本可以超出水平边界,继续显示
Vertical Overflow:垂直溢出
(1)Truncate:文本不显示超出垂直边界的部分
(2)Overflow:文本可以超出垂直边界,继续显示
Best Fit:勾选之后,编辑器发生变化,显示Min Size和Max Size
(1)Min Size:最小大小
(2)Max Size:最大大小
- Image控件
SourceImage贴图来源,Preserve Aspect 等比例缩放,ImageType Sliced是九宫
setNativeSize:设置贴图原始大小
Project那点图片 Editor GUI是unity4.6之前的GUI
- Button控件
Interactable是否交互性
Transition 过渡方式
- Color Tint 颜色过度
- SpriteSwap 图片过度
- Animation 动画 点击auto Generate 会生成动画状态机Button.controller
锚点:每个控件都有一个Anchor的属性,其作用是当改变屏幕分辨率的时候,
当前控件做如何的位置变化,即屏幕的自适应特性
锚点是PivotX,PivotY,掌握锚点与中心点的区别
小雪花就是锚点,每个控件都有一个小雪花,这个锚点不是Canvas整体的
这个相当于Canvas顶级锚点 每个控件都可以设置哦
也可以相当于父锚点
-- slider控件
Whole Numbers:整数数值
Value:数值
如果去掉Handle就变成了一个进度条了
事件 OnValueChanged(Single)
-- ScrollBar控件
Value是指值
Size是指滑块的高度
Number Of Steps 就是分几步完成,
-- Unity中Scroll View 的简单使用
https://blog.csdn.net/weixin_43367805/article/details/85650485
https://blog.csdn.net/qq_33461689/article/details/79270565
UI-->Scroll View 创建成功
Scroll Rect 组件中
Horizontal ---> 水平滑动
Vertical ---> 竖直滑动
Inertia --- > 惯性 使用时如果被勾选,当你滑动结束后仍会产生一定的移动, 取消勾选时, 滑动结束后不会产生一定的移动, 可以理解为惯性造成的, 你可以调节组件属性来达到自己想要的效果
在初次使用 Scroll View 时可能遇到的问题, 比如在 Content 下边添加了子物体之后不能进行滑动
原因就是你的Content 的大小没有调节好, 不能满足滑动的需求
那么你就要手动调节你的Content 的大小, 满足加载的GameObject 的大小需求
(这个Content 大小的问题很容易被忽略, so 要长点心喽)
Content 要添加一个组件 Grid Layout Group
Padding 下 Left ---距离左侧边界的距离
Right --- 距离右侧边界的距离
Top ----距离顶部边界的距离
Bottom ----距离底部边界的距离
Cell Size ---- Content 下的子物体的大小
Spacing ----- 子物体之间的间隔
Constraint 这个是经常使用的属性哦 (约束的意思)
Fixed Column Count ---- 固定列数
Fixed Row Count -----固定行数
stretch是撑满整个父容器 第一层节点选锚点,控件里的控件用stretch 四周扩展
- Anchor:
还提供了描点功能,该功能主要实现相对布局的功能。我们还可以非常直观的配置描点:
锚点描述的是当前UI的父对象的位置信息。而锚点则表示当前父对象坐标的(0, 0)点。
锚点不会超出父对象的范围,锚点是相对于自己上级来说的
- Pivot:
注册点或者叫做中心点,如果说Anchor表示的是UI的父级的位置,那么Pivot则表示UI本身的(0, 0)点的位置。
子对象中心点对准父级锚点,父级锚点和父级中心点可以不同
一个对象的中心点和锚点可以不同,锚点是针对它孩子来起作用的,中心点是针对它父亲起作用
- stretch:(类似wiget组件)
除了上面说到的还有一种stretch状态,该状态则表示当前UI距离父级UI边缘的距离,当设定了之后则是使用一种类似相对位置的方式来定义UI的位置及尺寸,
当我们选择水平和垂直都为stretch时,Pos X、Pos Y、Width和Height都改变为Left、Top、Right及Bottom,即使用了相对位置来排列
我们发现按钮始终和父级保持10个像素的距离,调整父级的尺寸会修改子级的尺寸
31.场景里怎么判断点击到了人物
是矩形跟点自己做算法碰撞 按照轴 深度 Z轴深度 点跟 矩形的碰撞 你知道吧
点跟 矩形的碰撞 就是点是否在矩形里面把
**.32.**
RPG 的地图,人物和建筑的关系?
还是兄弟关系感觉,对冲基金啊,人物往上走,地图往下走不就看上去人物相对于屏幕位置不变嘛。地图到边界就不移动了,人物没出屏幕就可以继续调整x,y坐标啊。
人物和地图层都要移动
建筑和地图是一层,人物单独一层,把有建筑的地方透明信息搞一下,人物走到建筑那透明一下即可
- (地图+建筑+NPC) (人物) 做两层即可
建筑物挡住了人物,可以让策划在地图编辑器里配置透明路点
- 半透明 (地图+建筑) + 人
- 真实遮挡
一个层里所有对象 根据Y轴实时层级交换
地图 + (人+建筑) ?
- 地图编辑器提供的功能:
导入地图,导入NPC,导入建筑物(宝箱)设置半透明点
[一切跟随地图移动的都可在添加上去]
生成json格式路点信息+NPC位置+半透明路点,是一个二维数组
可配置一个格子表示100像素宽高。
用laya做地图编辑器
**.33.**
Unity 动画系统 Animation 和 Animator的小实例
https://www.cnblogs.com/01zxs/p/9983242.html
https://blog.csdn.net/linxinfa/article/details/94392971
一、单独Animation来实现
空场景,找到一张Sprite图片,拖到面板中,右键添加Animation组件
点中这张pig猪的图片,点击Unity的 Window->Animation->Animation。出现如下:
选择Create New Clip,建立另一个动画Animation-Scale。
还可以通过简单代码来控制播放:
Animation ani = GetComponent<Animation>();
ani.Play("pig-scale");
二、Animation和Animator来实现
选中pig猪,与方式一不同的是,不要先添加Animation组件,直接Window--Animation--Animation,命名保存后,会出现2个文件 一个是Animation播放动画的,一个是Animator管理动画的。
pig猪会自动添加一个Animator组件,没有了Animation组件:
Animator可以管理这两个动画。创建动画切换的条件:AniState 为1时,播放Move动画,为2时,播放Scale动画。
相当于动画还是动画,只是Animator管理这些动画,gameobject挂一个Animator
1 取消勾选 Can Transition To Self,不然动画会出现抖动
Has Exit Time,如果勾选了,则表示在该动作完成后才允许切换,
但是一般我们要的都是立即切换,所以这里 不要勾选
Unity可以用两种方式控制动画
1 Animation,这种方式简单,直接 Play(“Idle”)或者CorssFade(“Idle”)就可以播放动画;
2 Animator,Unity5.x之后推荐使用这种方式,因为里面可以加上混合动画,让动画切换更加平
**34.** DoTween缓动插件
1、首先在Unity AssetStore 下载DoTween插件
2、之后再脚本中引入命名空间 using DG.Tweening;
3、实例化Tweener 对象(Tweener 主要保存物体动画信息)
https://blog.csdn.net/qq_35361471/article/details/79353071
https://blog.csdn.net/cuijiahao/article/details/104634255
https://www.codetd.com/article/7613890
//相机震动效果 参数:持续时间,力量,震动,随机性,淡出
//力量:实际就是震动的幅度,可以理解成相机施加的力的大小 使用Vector3可以选择每个轴向不同的强度
//震动:震动次数
//随机性:改变震动方向的随机值(大小:0~180)
//淡出:就是运动最后是否缓慢移动回到原本位置
//camera.transform.DOShakePosition(1, 10, 10, 50, false)
**35.**
unity transform的position和localPosition属性的区别
position是世界坐标中的位置,可以理解为绝对坐标
localPosition是相对于父对象的位置,是相对坐标,我们在transform栏看到的是相对坐标
如果对象是一级对象,position和localPosition是相同的
RectTransform 成员 localPosition 和 anchoredPosition 详解
1.RectTransform.localPosition (本地位置)
RectTransform.localPosition 顾名思义就是表示相对于父元素的位置,但是它不同于Transform.localPosition ,它是一个像素为单位的坐标,这个像素坐标系的原点依然是 RectTransform.parent.position,但是相较于Transform.localPosition 多了一个Unit(Unity度量单位)到像素的转换过程,正交相机下的换算方法如下(透视相机需通过视场角来推倒):
( RectTransform.position - RectTransform.parent.position) * (Screen.currentResolution.height / (Camera.main.orthographicSize*2))= localPosition
2.RectTransform.anchoredPosition(锚点坐标系位置)
UGUI研究院之界面中使用DoTween(七)
https://www.xuanyusong.com/archives/3330
Camera的 Projection :Perspective是三维摄像机,Orthographic是二维摄像机(平面摄像机—)
**.36** position,localPosition,anchoredPosition的关系
RectTransform recTransform = this.transform as RectTransform;
// (-4.0, -2.7, 90.0):(-187.0, -130.0, 0.0)
//改变锚点之后
//(-3.9, -2.7, 90.0):(-186.6, -129.5, 0.0)
//而面板上的位置:234,107
Debug.Log(recTransform.position+":"+ recTransform.localPosition+":"+ recTransform.anchoredPosition);
position是世界坐标,localPosition永远是本地坐标针对父级的中心点pivot来说的,(默认是中心点)
不是针对父级的锚点
anchoredPosition是针对设置的锚点的问题来说的。
锚点只是你自己设置的相对父级的位置和父级的中心点没任何关系。
localPostion和anchoredPosition没有任何关系
localPostion和stetch的left,right也没有任何关系
localPostion始终是子中心点对父中心点的坐标
**.36**
transform:translate()方法坐标详解
https://blog.csdn.net/qq_41161982/article/details/112243176
Translate(new Vector3(1,0,0)是移动物体的localpostion,同时postion也改了。
因为物体的world postion=父对象的world postion+这个物体的localpostion。
GetMouseButton:每一帧鼠标处于按下状态都会返回true,
GetMouseButtonDown:鼠标按下的那一帧返回true,GetMouseButtonUp:鼠标抬起的那一帧返回true,
这是电脑端的
Input.GetButtonDown兼有Input.GetKeyDown(0)和Input.getMouseButtonDown(0)两种功能,就是使用的时候有点绕,需要到InputManger设置
GetButton方法、GetButtonDown方法与GetButtonUP方法 手机端判断用这个
**.37**
UGUI Button绑定事件的几种方法
一,点击Button组件上的OnClick的+号
public Text m_Text;
public void ButtonOnClickEvent()
{
m_Text.text = "鼠标点击";
}
二,使用Button组件自带的onClick.AddListener方法
m_Button.onClick.AddListener(ButtonOnClickEvent);
public void ButtonOnClickEvent()
{
m_Text.text = "鼠标点击";
}
**.38**
C#中OUT的用法 out参数:返回值多个,不限类型 使用out修饰的变量不需要return
2d,3d射线技术都能用 首先,为GameObject需要添加组件“Box Collider”。
https://blog.csdn.net/u011601165/article/details/54317390
https://gameinstitute.qq.com/community/detail/111935
**.39**
Unity实战篇:实现场景切换画面和进度条
https://blog.csdn.net/qq_15020543/article/details/84289872