0%

Csharp 和 Unity 学习记录

罗马不是一天建成的.

环境配置 和 C# 语法

Windows10 环境下 Unity + Visual Studio 环境的配置

  1. 下载 Unity 2021.3.20f1 调整初始布局 (我习惯把 Hierarchy, Project, Inspector 并列放在右边三排 Console, Animation, Animator, Timeline 放在 SceneGame 视图正下面)

  2. 下载 Visual Studio 预装 Unity 和 dotnet 开发环境 调整初始布局 下载扩展:One Dark Pro, CodeNav, CodeMaid, Semantic Colorier. 习惯把 CodeMaid CodeNav 解决方案资源管理器放在左边一排.

  3. Unity Edit->Perference->External Tools->External Script Editor 选择 Microsoft Visual Studio 2022

  4. Markdown ALL in One 插件 按 Ctrl + Shift + V 显示预览视图

在 Visual Studio Code 集成终端中运行 C# 代码

首先在 VSCode 中下载 C# 扩展 在集成终端中 cd 到代码对应文件夹 dotnet new --help -> dotnet new console -> dotnet run

C# 一些和 Cpp 不一样的特性

  • 抽象 Abstraction

    • 抽象类 Abstract class: is a restricted class that cannot be used to create objects (to access it, it must be inherited from another class).
    • 抽象方法 Abstract method: can only be used in an abstract class, and it does not have a body. The body is provided by the derived class (inherited from).

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      // Abstract class
      abstract class Animal
      {
      // Abstract method (does not have a body)
      public abstract void animalSound();
      // Regular method
      public void sleep()
      {
      Console.WriteLine("Zzz");
      }
      }

      // Derived class (inherit from Animal)
      class Pig : Animal
      {
      public override void animalSound()
      {
      // The body of animalSound() is provided here
      Console.WriteLine("The pig says: wee wee");
      }
      }

      class Program
      {
      static void Main(string[] args)
      {
      Pig myPig = new Pig(); // Create a Pig object
      myPig.animalSound(); // Call the abstract method
      myPig.sleep(); // Call the regular method
      }
      }
  • 接口 Interface

    Note that you do not have to use the override keyword when implementing an interface.

  • C# 不支持多继承 但可以通过 Mutiple Interfaces 实现

  • 枚举类型 Enum

    1
    2
    3
    4
    5
    6
    7
    8
    9
    enum Level 
    {
    Low,
    Medium,
    High
    }

    Level myVar = Level.Medium;
    Console.WriteLine(myVar);
  • 事件 Event

    一个用户操作,应用程序需要在事件发生时响应事件。

  • 委托 Delegate

    事件在类中声明且生成,且通过使用同一个类或其他类中的委托与事件处理程序关联。包含事件的类用于发布事件。这被称为 发布器(publisher) 类。其他接受该事件的类被称为 订阅器(subscriber) 类。事件使用 发布-订阅(publisher-subscriber) 模型。

    发布器(publisher) 是一个包含事件和委托定义的对象。事件和委托之间的联系也定义在这个对象中。发布器(publisher)类的对象调用这个事件,并通知其他的对象。

    订阅器(subscriber) 是一个接受事件并提供事件处理程序的对象。在发布器(publisher)类中的委托调用订阅器(subscriber)类中的方法(事件处理程序)。

一道有意思的面试题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Program {
class A {
public A() {
PrintFields();
}
public virtual void PrintFields() {}
}

class B : A {
int x = 1;
public B() {
y = -1;
}

public override void PrintFields() {
Console.WriteLine("x={0},y={1}", x, y);
}
}

static void Main(string[] args) {
new B();
}
}

当使用new B() 构造 B 的实例时产生什么输出?

x=1, y=0 因为创建B的实例需要先隐式调用父类A的无参构造函数,执行PrintFields()方法,检查到是虚方法,转去检查实例类B,有重载方法,执行重载方法,输出x=1, y=0(创建子类对象时会首先调用父类构造函数之后才会调用子类本身的构造函数)

Unity 学习记录

Player Gameobject Set

Hierarchy -> Create Empty

  • Sorting Layers: Sorting layers lower in the list get drawn in front of layers above them in the list.

Player 实例需要的 Components (2D) :

  • Rigidbody 2D

  • Sorting Group : 确保所有子对象的部分作为一个整体被排序

Player Class and Singleton Abstract Class

创建一个 singleton abstract class 单例抽象类 和一个 player class .

Player Animation Controller

Events and Event Handler