Unity随笔-1

本文最后更新于:2023年9月23日 下午

随便写写

使用C#脚本

创建C#脚本的三种方法:

  1. 资源(Assets) -> 创建(Create) -> C#脚本(C# Script)
  2. 项目(Project)选项卡中,选择创建(Create) -> C#脚本(C# Script)
  3. 层级(Hierarchy)窗口中选择一个GameObject,在检查器(Inspector)中,单击添加组件(Add Component) -> New Script

给GameObject添加脚本

如果不是方法三创建的脚本,要添加到我们想添加到的GameObject中运行的话,直接从项目(Project)选项卡中选中脚本并拖放至GameObject上即可(如:将Move.cs脚本拖放到层级(Hierarchy)窗口中的Main Camera)。

将信息和反馈打印到Unity编辑器的Console窗口

可以使用Debug.Log()或者Debug.LogFormat()方法。下面是例子:

1
2
3
Debug.Log("Text goes here.");
Debug.Log(yourVariable);
Debug.Format("Text goes here, add {0} and {1} as variable placeholders", variable1, bariable2);

当然,Debug.Log()方法也支持字符串插值:

1
Debug.Log($"A string can have variables like {firstName} inserted directly!");

Start()和Update()方法

Start()

Unity在启用脚本的第一帧时便调用此方法。只会执行一次。主要用于设置变量或执行首次运行Update()之前需要发生的逻辑。也可用于在Console面板上显示一次性信息。

Update()

每帧显示后,Update()方法便由Unity调用(即每帧调用一次Update())。非常适合用来监测鼠标和键盘输入运行游戏逻辑

C#中的数组、字典和列表

数组

数组的特点

  • 数组可以存储任何类型的值,但所有元素都必须是同一类型。
  • 数组的长度或可容纳元素的数量在创建数组时就已设置,之后无法修改。
  • 如果在创建时没有分配初始值,则每个元素将被赋予一个默认值。存储数字类型的数组默认为0,而任何其他类型都默认设置为null。
    如何创建数组
    通用模板:elementType[] name = new elementType[numberOfElements];
    1
    2
    3
    4
    5
    6
    7
    8
    // example
    int[] newArray = new int[3];

    // Longhand initializer
    int[] newArray = new int[] {713, 549, 984};

    // Shortcut initializer
    int[] newArray = new int[] {713, 549, 984};

列表

如何创建列表
通用模板:List<elementType> name = new List<elementType>() {value1, value2};
列表中的操作
查找元素:

1
name[index];

统计元素:

1
name.Count();

增加元素:

1
name.Add(newElement);

插入元素:

1
name.Insert(index, newElement);

删除元素:

1
2
name.RemoveAt(index);
name.Remove(value);

字典

如何创建字典
通用模板:

1
2
3
4
5
Dictionary<keyType, valueType> name = new Dictionary<keyType, valueType>()
{
{key1, value1},
{key2, value2}
};

操作字典
统计键值对数量:

1
name.Count();

添加键值对:

1
2
name.Add(newKey, newValue);
name[newKey] = newValue;

修改键值对:

1
name[key] = newValue;

删除键值对:

1
name.Remove(key);

字典中是否包含指定键:

1
name.ContainKey(key);

在循环中捕获键值对:

1
2
3
4
5
6
foreach(KeyValuePair<keyType, valueType> kvp in name)
{
kvp.Key;
kvp.Value;
code block;
}

C#中的类、结构体与OOP

类的关键是它们是引用类型,也就是说,当类被赋值或传递给另一个变量时,系统引用的是原始对象,而不是创建一个新的脚本。
而结构体则是值类型,其特点有:变量不能在结构体声明的内部进行初始化,除非用static或是const修饰;不允许使用没有参数的构造函数。
结构体作为单独对象很容易被复制和修改(可直接structObject1 = structObject2),而类保留了对其原始对象的引用。

C#中的继承

如何创建继承?

1
2
3
4
accessModifier class SubClass: SuperClass
{
...
}

任何用publicprotectedinternal访问修饰符标记的基类成员都会自动成为派生类的一部分,但构造函数除外。类的构造函数总是属于包含它们的类,但仍可以从派生类中使用父类的构造函数:

1
2
3
4
5
6
7
public class ChildClass: ParentClass
{
public ChildClass(): base()
{

}
}

C#中的多态

一个方法可以通过调用类产生不同的行为,此即为多态
派生类对象的处理方式与父类对象相同。例如,一个由ParentClass类对象构成的数组也可以存储ChildClass对象,因为它们派生自ParentClass
父类可以将方法标记为虚拟方法(virtual,在访问修饰符和返回类型之间加入,如:public virtual void),这意味着派生类可以使用override(也是在访问修饰符和返回类型之间加入)关键字修改其命令(重载方法)。

访问组件

组件是什么呢?比如,对于一个GameObject,这里以MainCamera为例,单击它,在右边检查器(Inspector)中的就是它的组件了:Transform、Camera、Audio Listener和我们自己加上去的Learning Curve。
那要如何在自己编写的Learning Curve脚本中获取到Transform组件呢?可以用GameObject的类方法:GetComponent()Find()

  1. 访问当前的Transform组件 -> 使用GetComponent()
    1
    2
    GameObject.GetComponent<ComponentType>()
    camTransform = this.GetComponent<Transform>();
    这里能用this关键字,是因为两者都附加到相同的GameObject组件上。
  2. 访问另外一个GameObject上的组件 -> 使用Find() + GetComponent()
    1
    2
    directionLight = GameObject.Find("Directional light");
    lightTransform = directionLight.GetComponent<Transform>();

游戏设计入门

对于我们想要构建的内容,我们需要规划好以下几点:

  • 概念:对游戏的全局理念和设计,包括游戏类型和玩法风格。
  • 核心机制:角色可以在游戏中使用的可玩功能或互动方式。常见的游戏机制包括跳跃、射击、解谜、驾驶等。
  • 控制方案:玩家用来控制游戏角色、环境交互和其他可执行动作的键位映射。
  • 故事:推动游戏发展的背景叙事,用于在玩家与游戏世界之间建立共情与关联。
  • 艺术风格:游戏的总体观感,并体现在从角色、界面美术到关卡和环境设计的各方面。
  • 胜负条件:决定游戏输赢的规则,通常由一些可能会遭遇失败的目标构成。

这里有一只爱丽丝

希望本文章能够帮到您~


Unity随笔-1
https://map1e-g.github.io/2023/03/10/unity-essay-1/
作者
MaP1e-G
发布于
2023年3月10日
许可协议