系列课程笔记

用于记录成体系的课程内容



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
posted @ 2021-02-03 16:38  MagiOno  阅读(69)  评论(0)    收藏  举报