系列课程笔记
用于记录成体系的课程内容
Complete C# Unity Game Developer 2D
关于“函数”和“方法”
Q: Which two words can be used interchangeably (ie. you can say either and it will be correct) when we are creating C# code for Unity
A: Function & Method
Details: Yes. Technically a Method is a Function which is created within a class. And because all of our Functions are created within a class in Unity, we are always creating Methods.
在变量声明前添加[SerializeField]可以让该变量显示在检视窗口中,并在检视窗口进行修改。
1. 文字冒险游戏
给组件脚本添加变量和功能的过程:using - [SerializeField]声明 - 操作和赋值
state = action, process, behaviour
可编程对象:能够在单个资源存储数据的类,用于在脚本外存储数据,例如:变量、字符串等。
创建方法:创建C#脚本,把Monobehaviour改为ScriptableObject,在代码添加变量和处理过程即可。
可用作模板来方便创建对象。可编程对象脚本不必附加到对象上。
创建脚本时重命名会同时修改脚本内的类名,但之后重命名不会同步修改脚本内类名,需要自己手动更改。
[CreateAssetMenu(menuName = "State")],这样就可以在编辑器直接创建名为State的资源,该资源的形式符合之前可编程对象脚本内容。
在[SerializeField]之前添加[TextArea(14,10)](第一个值表示文本框的最小高度,第二个值表示出现滚动条前的最大行数)来设置编辑器内的文本框大小。
在VS选中某个变量,按下Ctrl+R+R,就可以一次性改变所有同名变量。
[SerializeField] State[] nextStates;会在编辑器添加可自定义大小的数组。
在声明和初始化特定变量时,可以使用var来快速指定类型。条件是其内容必须事先已经出现在本地变量声明或在脚本代码中,即需要有Context语境。
在空白对象添加脚本组件,用于加载新场景。
ToString()用于转换类型以显示内容。
进入游戏和切换场景的代码:
```
public void LoadNextScene()
{
int currentSceneIndex = SceneManager.GetActiveScene().buildIndex;
SceneManager.LoadScene(currentSceneIndex+1); //用于加载下一个场景
}
public void LoadStartScene()
{
SceneManager.LoadScene(0); //使用场景编号来加载指定场景
}
```
退出游戏的代码:
```
public void QuitGame()
{
Application.Quit();
}
```
When displaying our guess to the player, why do we need to use ToString() and not just display our integer as it is?
We're using a text field so we can make our guess font look pretty, and our text field requires data as a string.
When using Random.Range() with integers, min is inclusive and max is exclusive
2. 打砖块游戏
利用Assets > Export Package来导出项目部分内容为unitypackage格式文件,以便导入后续项目进行重用,例如菜单部分。
Orthographic Camera: Size is half of height
通常要把背景中心改到画面左下角,以便设定画面的位置,这样整个画面就都在XY坐标轴的第一象限(即XY值都为正数)。
方法是,把背景精灵的轴心改到左下角。改变轴心时,可以按住Ctrl键来对齐。之后把摄像机移动到画面中心。
调整背景以适应摄像机大小:如果摄像机的Size值为6,背景高度为1080,那么1080÷(6×2)=90,因此我们需要把背景精灵的Pixels Per Unit设为90。摄像机的Position XY设为8和6即可。
Pixels Per Unit越大,精灵在场景中越小,例如:PPU为64的方块大小是PPU为128的方块的四倍。
使用Physics Material来给对象添加弹力和摩擦力等物理属性。
所有与Trigger属性的对象发生的碰撞都属于Trigger事件。这样就可以使用OnTriggerEnter2D函数来控制碰撞后发生的事情。
初识虚幻引擎
Part 2
常用热键:
使用G键切换游戏模式
Ctrl+1 存储视口书签;数字1用来恢复已存书签
F11用于进出沉浸模式
F键会聚焦于选中对象
多用“全部保存”
Part 3
添加内置内容:新增 > 添加功能或内容包
在二个项目之间传递资源:在资源单击右键 > 迁移
Part 4
为什么资源在World Outliner却看不到?
UE4会尽量与现实规则保持一致,如果使用基于物理的材质,没有光就什么都看不到,所以要添加光源。
右上角设置网格,让砖块大小紧密匹配,对齐位置设为100,方便对齐
按住Alt拖动资源来创建副本
添加天空:使用大气雾,在Atmosphere / Fog Sun Light改变大气雾的颜色
反射采集:添加Sphere Reflection Capture,在视口上工具栏选择Build > Build Reflection Caputures
Part 5
目前问题:阴影和光照不自然,缺少辅助光(Fill Light)来去除深阴影。由于场景只有定向光存在,因此阴影内没有照射进来的光,即反射光。
这个问题可以用天空光来解决,一般使用默认设置即可。
天空光在实现光照平衡方面不够好,需要稳定曝光来提供合适光照效果,这部分可以使用后期处理体积解决,它能够用单一控制点来影响所有摄像机镜头。
在后期处理体积,找到最低亮度和最高亮度来控制曝光度,都设为1,这会强制自适应曝光度锁定在默认曝光度,然后勾选Infinite Extent,使其作用于整个关卡。
添加天空球体,Directional Light Actor设为DirectionalLight。
把DirectionalLight内Light部分的Intensity设为1,使用旋转工具改变太阳角度。旋转时可能会发现太阳光电不更新,禁用和启用天空球体便可解决,点击天空球体的Refresh Material即可。
增添活力,在DirectionalLight勾选Light Shaft Occulusion和Light Shaft Bloom,这样太阳会添加光晕。光晕太大的话,在天空光把Sun Brightness设为1,在定向光微调Bloom Scale
Part 6
Actor的概念:可能包含多种资源,根据蓝图来执行操作。
在Actor内,让资源不互相嵌套:把被嵌套资源拖到根目录下,选择Attach附着
Random Float in Range:限定范围内的随机值
Set Intensity节点:输入光源和亮度值,输出亮度改变结果
设置无限循环,把结束节点的输出连接到开始节点的输入
阴影部分显示“Preview”:需要烘焙光照,视口工具栏 > Build > Build Lighting Only,添加新内容需要重新烘焙光照
EOF

浙公网安备 33010602011771号