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 的数组(数组之后介绍)先认为是字符的集合
注意点:
变量如何声明和赋值
声明变量的方式
推荐的变量命名规则
示范常用的数据类型
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
注意点:
数组初始化的几种方式
访问数组 修改数据
如何获取数组的长度
示范二维数组
(循环)访问数组
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)无返回值:
void + FunctionName + (args) + {}
(2)有返回值:
type + Function + (args) + {return type;}
函数调用:函数调用时,传入的参数的数据类型,必须和被调用的函数参数的数据类型,顺序保持一致。
扩展内容 - 如何调试程序:选中某一行 F9 → 附加到Unity,同时启动Unity → F11进入函数体内,F10单步执行 → F5退出当前的断点
小作业:调试函数,更改数组某个下标值,通过跟踪调试,看下设置的值有没有生效
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);
}