此章节主要总结C#脚本在Unity的运用中需要学习的基本语法内容,主要包括变量,数据类型,数组,函数等基础的C#编程语法知识
变量指的是可以随时修改、变更的量,而数据类型则是规定了变量的种类。在C#中,通常使用 数据类型 变量名; 的方式来定义一个变量。
在C#的使用中,常见的数据类型有:
数据类型 | 取值范围 |
---|---|
byte | 0 - 255 |
short | -32768 - 32767 |
ushort | 0 - 65535 |
int | -2^31 - 2^31-1 |
uint | 0 - 2^32 |
long | -2^63 - 2^63-1 |
ulong | 0 - 2^64 |
float | 7位小数 |
double | 15 - 16位小数 |
char | 单个字符 |
string | 字符串 |
bool | true / false |
在C#当中,可以用如下的一些语法定义,赋值,修改变量
int integer = 10;
Debug.Log("修改前的integer值为:" + integer);
integer = 30;
Debug.Log("修改后的integer值为:" + integer);
数组即为变量的连续地址的集合。数组类型在C#当中属于引用类型(在一中举例出的常见型中,string也属于引用类型,其它都属于值类型。它们的具体区别会在之后的学习中提及,在此只需要记住便可),在使用时不可以单纯的使用 数组类型[] 数组名; 的方式来定义使用,而是必须使用 new 关键词来创建一个新的空间来存放该数组。
代码如下,可在vs中自己编译尝试:
int[] a; // 如果在此处后直接进行,例如a[0] = 0的操作,会报错
// 数组的几种常见初始化方法
a = new int[5]; // 开辟一个大小为5,无初值的数组
a = new int[]{1, 2, 3}; // 开辟一个大小为3,初值为1,2,3 的数组
a = {1, 2, 3}; // 与上个操作效果相同,不过是另一种语法形式
函数,也叫方法,在实际使用中用于规整冗杂的重复代码块,可以在每需要使用时,通过函数名的调用,快捷的得到自己想要的结果。
函数定义的一般形式为修饰词 函数名(参数) {函数体}
函数的在定义时需要注意以下几种修饰词
访问修饰符用于限制函数的访问权限,常用的访问修饰词有如下几种
修饰词 | 可访问范围 |
---|---|
public | 在所有地方可以访问 |
private | 在函数所在的类中能访问 |
protected | 在函数所在的类及其子类中可访问 |
internal | 在函数所在的类及其程序集中可访问 |
protected internal | 上述两种的合体版 |
返回类型修饰词用于规范函数返回的值类型,其常见类型与数据类型相同。需要特别注意的是,函数有void类型,该类型不返会任何值。
余下修饰词会在类的学习中更加频繁的学习和使用,在此处有印象即可。
修饰词 | 作用 |
---|---|
static | 用于定义静态函数 |
abstract | 用于定义抽象函数 |
virtual | 用于定义虚函数 |
override | 用于重写函数 |
函数使用实例,计算a + b的值并返回int型:
// 需求: 计算a + b的值并返回int型
public int Sum(int a, int b)
{
return a + b;
}
void Start()
{
int a = 10, b = 20;
int sum = Sum(a, b);
Debug.Log("a + b的值为:" + sum);
}
在C#语法中,运算符主要包括赋值运算符,算术运算符,逻辑运算符(包括三目运算符),位运算符几种。其中逻辑运算符,常配合逻辑语句使用。下面介绍几种常见运算符的用法。
作用是给变量赋值,使用模式为变量 = 常量或变量 = 变量,来对变量进行值的赋予或篡改,也可以使用变量 = 运算式的方式,来给变量进行赋值。
即在数学中常用的加减乘除等运算,用于值的计算,也可以和赋值运算符配合用于赋值。
运算符 | 运算规则 | 举例 |
---|---|---|
+ | 加法规则 | 5 + 3 = 8 |
- | 减法规则 | 5 - 3 = 2 |
* | 乘法规则 | 5 * 3 = 15 |
/ | 除法规则 | 5 / 3 = 1 |
% | 取余运算 | 5 % 3 = 2 |
使用实例,计算a,b的上述5种运算结果,分别赋值给num并输出
// 需求:计算a,b的上述5种运算结果,分别赋值给num并输出
int a = 5, b = 3;
int num;
num = a + b;
Debug.Log("a + b = " + num);
num = a - b;
Debug.Log("a - b = " + num);
num = a * b;
Debug.Log("a * b = " + num);
num = a / b;
Debug.Log("a / b = " + num);
num = a % b;
Debug.Log("a % b = " + num);
一般运算符常与逻辑语句配合使用,返回bool型的值(true/flase),常用的逻辑运算符有以下几种。
运算符 | 运算规则 |
---|---|
< | 判断前置是否小于后置,若是则返回true,否则返回false |
<= | 判断前置是否小于等于后置,若是则返回true,否则返回false |
> | 判断前置是否大于后置,若是则返回true,否则返回false |
>= | 判断前置是否大于等于后置,若是则返回true,否则返回false |
== | 判断前置是否等于后置,若是则返回true,否则返回false |
&& | 判断前后两个判别式是否全为真,全为真返回true,否则返回false |
丨丨 | 判断前后两个判别式是否全为假,全为假返回false,否则返回true |
! | 判断当前判别式为true,则返回false,反之亦然 |
三目运算符的一般格式为判别式 ? 语句1 : 语句2,当判别式为true时,则执行语句1,若判别式为false,则执行语句2。
if else语句的一般使用形式如下:
if( 判别式1 ) { 代码块 }
else if( 判别式2 ) { 代码块 }
……(可一直重复else if)
else { 代码块 }
运用实例,比较三目运算符和if else语句,判断a,b的大小
//比较三目运算符和if else语句,判断a,b的大小
int a = 10, b = 20;
// 三目运算符
a < b ? Debug.Log("a小于b") : Debug.Log("a大于b");
// if else语句
if(a < b)
{
Debug.Log("a小于b");
}
else
{
Debug.Log("a大于b");
}
switch语句(开关)常用在一个需要判别的变量,存在多种判别结果的场景。虽然用if else语句可以完成同样的功能,但switch语句可以使代码更加整齐、简单。switch的定义形式如下:
switch( 判别变量 )
{
case 情况1:
{ 代码块 }
break;
case 情况2:
{ 代码块 }
break;
……(可以一直增加情况)
default:
{ 代码块 }
break;
}
在C#的使用中,switch语句常和枚举类型一起出现,在枚举类型中,将会一并展现两者的用法。
位运算符的运算规则主要作用于变量的二进制存储形式上。在此我们举例a = 5,b = 3的情况下,一些常见位运算符的运算结果。
a = 5 = 0101(2)
b = 3 = 0011(2)
运算符 | 运算规则 | 运算举例及结果 |
---|---|---|
丨 | 两边全0返回0,否则返回1 | a丨b = 0111 = 7 |
& | 两边全1返回1,否则返回0 | a & b = 0001 = 1 |
^ | 两边不同返回1,否则返回0 | a ^ b = 0110 = 6 |
~ | 对二进制取反 | ~a = 1… 1111 1010 |
枚举类型中可以定义多个属性,来方便我们完成对一个多属性变量的操控。枚举类型的定义方法如下:
访问级修饰词 enum 枚举名
{
属性1,
属性2,
……
属性n
}
以下是一些常用的关于enum的类型转换操作
enum 转 string
public enum emAttribute
{
attribute1,
attribute2,
}
emAttribute mAttribute = emAttribute.attribute1
// 1. 直接输出
Debug.Log(mAttribute);
// 2. ToString函数
Debug.Log(mAttribute.ToString());
string 转 enum,使用Parse方法
string str = "attribute2"; // 只能转enum中有的字符
mAttribute = (emAttribute)Enum.Parse(Typeof(emAttribute), str)
enum 转 int
// 直接强制转换
Debug.Log((int)mAttribute);
int 转 enum
int num = 0;
// 1 直接强制转换
mAttribute = (emAttribute)num;
Debug.Log(mAttribute);
// 2. ToObject方法转换
mAttribute = (emAttribute)Enum.ToObject(Typeof(emAttribute), num);
Debug.Log(mAttribute);
在实际的使用过程中,enum常于switch配合使用,可以让代码更加的工整,使其可读性大大提高。接下来通过一个实例了解switch和enum在代码中的实际运用方法。
实例:下列时某人今天做过的事,请你在他正在做这件事的时候打印出该事件:
- 吃早饭
- 学英语
- 玩耍
- 发呆
/*
需求:
下列时某人今天做过的事,请你在他正在做这件事的时候打印出该事件:
1. 吃早饭
2. 学英语
3. 玩耍
4. 发呆
*/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public enum emAction
{
None, // 占位符
haveBreakfast,
learnEnglish,
play,
doNothing
}
public emAction mAction = emAction.None;
void Start()
{
}
void Update()
{
switch (mAction)
{
case emAction.haveBreakfast:
{
Debug.Log("Have Breakfast");
}
break;
case emAction.learnEnglish:
{
Debug.Log("Learn English");
}
break;
case emAction.play:
{
Debug.Log("Play");
}
break;
case emAction.doNothing:
{
Debug.Log("Do Nothing");
}
break;
default:
{
Debug.LogError("Have Not This Choise");
}
break;
}
}
循环语句主要用于简化需要重复执行的冗杂代码块,其主要语法有三种,分笔试for循环,where循环和do where循环。其中for循环和where循环十分相似,只有语法略微不同,而do where循环还有一点需要注意,即在第一次进入循环时,会把其中代码先执行一遍,再进行判断。
下面我们用三种循环语句,来实现1-100的值的累加,以此学习三种循环的具体使用方法。
定义方式为 for(变量; 判别式; 变量计算) { }
代码实践如下
// 计算 1-100 的累加值
int sum = 0;
for(int i = 1; i <= 100; i ++)
{
sum += i;
}
Debug.Log("累加的值为:" + sum);
定义方式为 where(判别式) { }
代码实践如下
// 计算 1-100 的累加值
int sum = 0;
int i = 1;
where(i <= 100)
{
sum += i;
i ++;
}
Debug.Log("累加的值为:" + sum);
定义方式为 do { } where(判别式);
代码实践如下
// 计算 1-100 的累加值
int sum = 0;
int i = 1;
do
{
sum += i;
i ++;
}where(i <= 100);
Debug.Log("累加的值为:" + sum);
以上就是C#的基础语法部分,实际上与C、C++以及Java等编译语言存在着许多相同,类似的地方,因此如果有以上几种语言基础的话,可以很快理解C#的语法,因此对于原理方面的解释较少,更多体现的是C#的语法特点。
因为在此专题中,对C#的学习主要是为了服务与Unity的学习和使用,对于语法中有疑惑的部分,建议在Unity环境下创建的C#脚本中进行实验练习。