HOME
BLOG
基础语法专题(1)
9月 02 2022

Unity + VS 安装

Unity 编辑器版本 :2019.4.15f1c1 LTS

此乃准备工作

下一步

go –>


C# 与 Unity 的关系

| C# 简介:

C# 是一个现代的、通用的、面向对象的编程语言,它是由微软(Microsoft)开发的,由 Ecma 和 ISO 核准认可的。由 Anders Hejlsberg 和他的团队在 .Net 框架开发期间开发的。专为公共语言基础结构(CLI)设计的。CLI 由可执行代码和运行时环境组成,允许在不同的计算机平台和体系结构上使用各种高级语言。

| 相关内容:

  • C# → 通过编辑器形成一个中间代码(IL)→ CLR虚拟机 → 二进制机器码 → 运行

  • 下面列出了 C# 成为一种广泛应用的专业语言的原因:

    • 现代的、通用的编程语言。

    • 面向对象。

    • 面向组件。

    • 容易学习。

    • 结构化语言。

    • 它产生高效率的程序。

    • 它可以在多种计算机平台上编译。

    • .Net 框架的一部分。

  • Unity跨平台解决方案 - 一个代码可以多平台运行


第一个C#小示例

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class HelloWorld : MonoBehaviour
{
    void Start()
    {
        Debug.Log("HelloWorld");
        Debug.LogWarning("HelloWorld");
        Debug.LogError("HelloWorld");
    }
}

| 一些知识点:

  • “ : “代表继承

  • MonoBehaviour 是Unity提供给我们的父类,里面包含很多生命周期的方法,可以去覆盖

  • ’ Start ‘ 代表函数

  • ‘ Debug ‘是Unity提供的日志接口

  • C# 大小写敏感

  • 所有语句和表达式必须以分号 ; 结尾

  • 与 Java 不同的是,文件名可以不同于 类 的名称


变量(Variable)

| 变量赋值:

<data_type> <variable_name> = value

int a = 10

// data_type - 数据类型

// variable_name - 变量名字

// value - 数值 / 存储的内容

| 数据类型取值范围:

// 存放内容不同

Q:为什么要有数据类型和取值范围?

A:比如说文本 ===》 string    即 ‘ 文本 ’ 能存在 string 里123 ===》 int     即 ‘ 123 ’ 能存在 int 里

整数行:
类型 System命名空间中的名字 取值范围
sbyte System.Sbyte -128 ~ 127 之间的整数
byte System.Byte 0 ~ 255 之间的整数
short System.Int16 -32768 ~ 32767 之间的整数
ushort System.UInt16 0 ~ 65535 之间的整数
int System.Int32 -2147483648 ~ 2147483647 之间的整数
uint System.UInt32 0 ~ 4294967295 之间的整数
long System.Int64 -9223372036854775808 ~ 9223372036854775807 之间的整数
ulong System.UInt64 0 ~ 18446744073709551615 之间的整数
小数点行:
类型 System命名空间中的名字 取值范围 m的最小值 m的最大值 e的最小值 e的最大值 近似的最小值 近似的最大值
float System.Single 3.4E-38 ~ 3.4E+38 0 224 -149 104 1.5x10-45 3.4x1038
double System.Double 1.7E-308 ~ 1.7E+308 0 253 -1075 970 5.0x10-324 1.7x10306
decimal System.Decimal 正负 1.0×10-28 ~ 7.9×1028之间 0 296 -26 0 1.0x10-28 7.9x1028
a小数点非整数:
类型 System命名空间中的名字 取值范围
char System.Char 一个Unicode字符,存储 0 ~ 65535 之间的整数
bool System.Boolean 布尔值,true 或 false
string System.String 一组字符

| 常用的数据类型:

  • ‘ char ’ 表示一个字符,字母 数字 @#¥%……& * ()一个汉字

  • ‘ string ’ 是一个 char 的数组(数组之后介绍)先认为是字符的集合

注意点:

  1. 变量如何声明和赋值

  2. 声明变量的方式

  3. 推荐的变量命名规则

  4. 示范常用的数据类型

     void Start()
     {
         // 变量的声明
         int a;
         // 变量的赋值(当变量第一次赋值的时候,称之为 初始化)
         a = 10;
         // 变量的声明 + 赋值
         int b = 20;
         // 单行赋值多个相同数据类型的变量
         int c = 30, d = 40;
    
         // 匈牙利命名法(驼峰式)
    
         int hpValue = 1000;
         int iHpValue = 2000;
    
         // string str
         string strMonsterName = "treeman";
         //char ch
         char chUnicode = 'a';
         //short sh
         short shID = 100;
         //long l
         long lID = 1000;
         //bool true or false   b is(常用)
         bool isOpen = true;
    
         Debug.Log("a:" + a + ",b:" + b + ",c:" + c + ",d:" + d);
         Debug.Log("hpValue:" + hpValue + ",iHpValue:" + iHpValue + ",strMonsterName:" + strMonsterName + ",chUnicode:" + chUnicode + ",shID:" + shID + ",lID:" + lID + ",isOpen:" + isOpen);
     }
    

| 案例:

存储一个怪物信息:

  • 名字

  • 血量

  • 等级

  • 经验值

      void Start()
      {
          string strName = "MonsterA";
          int iHpValue = 1000;
          int iLevel = 100;
          long lExp = 100000000000;
    
          Debug.Log("名字:" + strName + ",血量:" + iHpValue + ",等级:" + iLevel + ",经验值:" + lExp);
          Debug.LogFormat("名字:{0},血量:{1},等级:{2},经验值:{3}", strName, iHpValue, iLevel, lExp);
      }
    

数组(Array)

数组的概念:

数组,是有序的相同数据类型元素组成的有限集合,内存是线性连续的。

声明方式:

一维数组:<data_type>[] variable_name

二维数组:在[]里加一个逗号

三维数组:在[]里加两个逗号

N维数组:(♯▼皿▼)

数据容量和下标的关系: 下标 = 容量 - 1

注意点:

  1. 数组初始化的几种方式

  2. 访问数组 修改数据

  3. 如何获取数组的长度

  4. 示范二维数组

  5. (循环)访问数组

     void Start()
     {
         int[] array;                // 数组的声明 并没有分配内存
         int[] array2 = new int[5];  // 数组的声明和内存分配
    
         // 第一种 数组初始化
         int[] array3 = new int[5];
         array3[0] = 10;
         array3[1] = 20;
         array3[2] = 30;
         array3[3] = 40;
         array3[4] = 50;
         // array3[5] = 60;             不可以,运行时数组越界
         Debug.Log("[原始数据]访问第4个元素(第3个下标)代表的数据:" + array3[3]);
         array3[3] = 400;
         Debug.Log("[修正数据]访问第4个元素(第3个下标)代表的数据:" + array3[3]);
         // 第二种 数组初始化
         int[] array4 = new int[5] { 100, 200, 300, 400, 500 };  // 容量显示声明
         int[] array5 = new int[] { 100, 200, 300, 400, 500 };   // 容量隐式分配
         // 第三种 数组初始化
         int[] array6 = { 1000, 2000, 3000, 4000, 5000 };        // 有几个打印出来的就是几个
    
         Debug.Log("获取 array6 的数组长度(容量)=" + array6.Length);
    
         // ------------------------------------------------------------------------
         int[,] array7 = new int[2, 2];  // 2行2列的数组
         array7[0, 0] = 100;             // 1行1列
         array7[0, 1] = 200;             // 1行2列
         array7[1, 0] = 300;             // 2行1列
         array7[1, 1] = 400;             // 2行2列
    
         Debug.Log("[原始数据]打印第二行第一列的数据:" + array7[1, 0]);
         array7[1, 0] = 3000;
         Debug.Log("[修正数据]打印第二行第一列的数据:" + array7[1, 0]);
    
         // 常用写法 1
         int[,] array8 = new int[2, 2]
         {
             {1000,2000 },
             {3000,4000 },
         };
         // 常用写法 2
         int[,] array9;
         array9 = new int[2, 3]
         {
             {1000,2000,9 },
             {3000,4000,8 },
         };
    
         Debug.Log("array9 总长度(容量):"+array9.Length);
         Debug.Log("array9 行数:" + array9.GetLength(0));
         Debug.Log("array9 列数:" + array9.GetLength(1));
    
         // ------------------------------------------------------------------------
         //x,y,z 作业如下:存储数据,并读取数据
         int[,,] array10 = new int[3, 3, 3];
         array10[0, 0, 0] = 100;
         array10[1, 1, 1] = 200;
         array10[2, 2, 2] = 300;
    
         Debug.Log("array10 总长度(容量):" + array10.Length);
         Debug.Log("array10 行数:" + array10.GetLength(0));
         Debug.Log("array9 列数:" + array10.GetLength(1));
    
         Debug.Log("[未存储数据]打印 array10 数据:" + array10[1, 0, 1]);
         Debug.Log("[存储数据]打印 array10 数据:" + array10[1, 1, 1]);
    
         // ------------------------------------------------------------------------
         // 数组访问两种方式
         // 1.下标的方式
         // 2.循环遍历的方式(研究)
     }
    

函数(Function)

注意点:

  1. 函数返回值的分类

    (1)无返回值: void + FunctionName + (args) + {}

    (2)有返回值: type + Function + (args) + {return type;}

  2. 函数调用:函数调用时,传入的参数的数据类型,必须和被调用的函数参数的数据类型,顺序保持一致。

  3. 扩展内容 - 如何调试程序:选中某一行 F9 → 附加到Unity,同时启动Unity → F11进入函数体内,F10单步执行 → F5退出当前的断点

  4. 小作业:调试函数,更改数组某个下标值,通过跟踪调试,看下设置的值有没有生效

     void Start()
     {
         ShowContxt();
         ShowName("森木清树");
         ShowName2("森木清树",22);
         // ShowName2(22,"森木清树");  错误
    
         int result = GetSum(1, 2);
         Debug.Log("和:" + result);
     }
    
     void ShowContxt()
     {
         Debug.Log("ShowContxt 被调用");
     }
     void ShowName(string strName)
     {
         Debug.Log("ShowName 输出参数:" + strName);
     }
     void ShowName2(string strName, int iAge)
     {
         Debug.Log("ShowName 输出参数:" + strName + ",年龄:" + iAge);
     }
    
     int GetSum(int a,int b)
     {
         int sum = a + b;
         return sum;
     }
    

运算符 相关内容 1:

|算术运算符:

下表显示了 C# 支持的所有算术运算符。假设变量 A 的值为 10,变量 B 的值为 20,则:

运算符 描述 实例
+ 把两个操作数相加 A + B 将得到 30
- 从第一个操作数中减去第二个操作数 A - B 将得到 -10
* 把两个操作数相乘 A * B 将得到 200
/ 分子除以分母 B / A 将得到 2
% 取模运算符,整除后的余数 B % A 将得到 0
++ 自增运算符,整数值增加 1 A++ 将得到 11
自减运算符,整数值减少 1 A– 将得到 9

| 赋值运算符:

下表列出了 C# 支持的赋值运算符:

运算符 描述 实例
= 简单的赋值运算符,把右边操作数的值赋给左边操作数 C = A + B 将把 A + B 的值赋给 C
+= 加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数 C += A 相当于 C = C + A
-= 减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数 C -= A 相当于 C = C - A
*= 乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数 C *= A 相当于 C = C * A
/= 除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数 C /= A 相当于 C = C / A
%= 求模且赋值运算符,求两个操作数的模赋值给左边操作数 C %= A 相当于 C = C % A
<<= 左移且赋值运算符 C <<= 2 等同于 C = C << 2
>>= 右移且赋值运算符 C >>= 2 等同于 C = C >> 2
&= 按位与且赋值运算符 C &= 2 等同于 C = C & 2
^= 按位异或且赋值运算符 C ^= 2 等同于 C = C ^ 2
\ = 按位或且赋值运算符

课程内容:

    void Start()
    {
        Func1();
        Func2();
    }

    void Func1()
    {
        int a = 5;
        int b = 5;

        // + - * /
        // %
        int c = a % b; // a/b 得到的余数部分
        Debug.Log(c);
        Debug.Log(9 % 8); // 等于1
        // (1,2,3,4,5,6,7,8,9,10)
        // A % 2 = 0

        // ++ -- 
        a++; // a = a+1 即 5+1 = 6
        b--; // b = b-1 即 5-1 = 4
        Debug.Log(a);
        Debug.Log(b);
    }

    void Func2()
    {
        int a = 5;
        int b = 5;

        a += b; // a = a+b 即 5+5 = 10
        Debug.Log(a);

        // <<  - 乘 2 的 N 次方
        a = a << 2; // a * 2*2 即 10 * 2*2 = 40 << 就是乘以2的2次方
        b = b << 2; // b * 2*2 即  5 * 2*2 = 20 << 就是乘以2的2次方

        // >> - 除以 2 的 N 次方
        // a = a >> 2; // a/2*2 = 10/4 = 2.5 这是个小数3

        Debug.Log("a:" + a);
        Debug.Log("b:" + b);

        // 小数和整数区别
        float aa = 10;
        int bb = 10;

        float c = aa / 3; // 3.333...
        bb = bb / 3; // 3

        Debug.Log("bb:" + bb);
        Debug.Log("c:" + c);

        // <<= 、>>=
        int c2 = 3;
        c2 <<= 2; // c2 = c2 << 2 = 3 * 2*2 =12
        Debug.Log("c2:" + c2);

        // 尝试一下
        int d = 5;
        d = d << 5;  // 5 * 2*5次 = 160 乘以2的5次方
        Debug.Log("d:" + d);
    }


👾 - Morikiiii - 👾

C# Study