一、控制台输出和代码注释
(一)控制台输出
1、Debug:调试代码工具
cs
void Start()
{
Debug.Log("a");
Debug.LogWarning("a");
Debug.LogError("a");
}
2、Log:一个功能,输出日志
(二)注释
注释是给人看的,机器忽视
1、**//**注释
2、**/**/**注释
3、代码折叠: #region #endregion
二、变量以及常用类型
(一)什么是变量
数据的抽象表示;可以变化的;自定义信息;可以表示一切
(二)常用变量类型
string(字符串):存储用户名、密码、角色名称、技能名称等
int(整数):角色等级、纯数字id等
float(浮点数):小数,存储时间这类对精度要求更高的数值
(三)变量的声明
类型 变量名 = 变量初始值;
cs
string id = "liucahn";
int age = 18;
float num = 2003f;
Debug.Log(id);
Debug.Log(age);
Debug.Log(num);
(四)变量的命名方法
方法:驼峰命名法
首字母不能是数字,但是后续可以是数字
三、转义字符
(一)转义字符
cs
//转义字符是针对字符串的
//特殊需求:输出双引号
//程序认为 双引号是特殊符号,包括起来的就是字符串
//\: 转义字符,他本身也是一个特殊符号
string myName = "\'Joker\'";
Debug.Log(myName);
cs
//输出转义字符的方式,用转义字符去修饰
Debug.Log("\\\\");
\n 换行符 使用的比较多
(二)原义符
@:用来取消转义字符的特殊意义,要写在双引号外面
cs
string myName1 = @"\'Joker\'";
Debug.Log(myName1);
四、字符串拼接
(一)+号连接
cs
//加号拼接
string name = "Joker";
int age = 18;
Debug.Log("我是"+name+"我今年"+age+"岁");
cs
//加号拼接
string name = "Joker";
int age = 18;
string info = name + age;
Debug.Log(info);
(二)$美元符号格式化输出
使用$美元符号和{} 关联使用
cs
//$格式化输出 用{}包裹变量名
string qwer = $"我是{name},,我今年{age}岁";
Debug.Log(qwer);
五、变量的类型转换
(一)变量的定义方式
定义但没有赋值,不可以使用;
同类型变量批量赋值;
cs
//批量定义,只需要写一次类型,使用逗号分隔变量名
int a=1,b=2,c=3;
Debug.Log(a);
Debug.Log(b);
Debug.Log(c);
(二)等式的理解
等式右边的结果会赋值给左边,所以左边只能是变量,不能是数值;
等式右边的类型要和左边一致;变量可以在等式两边任何一边;
cs
int a1 = 1;
int r1 = a1;
Debug.Log(r1);
(三)数值的类型
数值也是有类型的。C#内置的类型背后都有一个实际类型。
string:String
int:Int32
float:Single
char:Char
(四)类型的转换方式
1、隐式转换
无需人为干涉的自动转换
要求:类型上的兼容;精度小的转为精度大的
cs
int num = 10;
float fnum = num;//把num数值隐式转换为float类型
Debug.Log(fnum);
cs
//另一种情况
float a = 10f;
int b = a;//无法隐式转换,因为int类型精度低于float类型精度,无法承载
这时候就需要进行显示转换
2、显示转换
人为干涉的强制转换
要求:类型上的兼容;如果将精度大的转为精度小的,会丢失精度
cs
//强转,丢失精度 (显示转换)
float num3 = 10.01f;
int m = (int)num3;
Debug.Log(m);
特殊:ToString()用法 ;将其他类型转换为string类型
cs
//转为字符串
int age = 10;
float height = 180f;
string agestr=age.ToString();
string heightStr= height.ToString();
3、Convert强行转换
本身对放进去的变量类型没什么限制,但是如果完全不具备转换的可能性,会报错
转换为Int:Convert.ToInt32
转换为float:Convert.ToSingle
转换为string:Convert.ToString
六、作用域和常量
(一)变量的作用范围
1、变量具备一个有效范围,这个范围就是它的作用域;
2、当大括号{}嵌套时:父级的变量可以用在子级中;子级的变量不可以用在父级中
cs
private void Start()
{
int num = 2;
Debug.Log(num);
}
void Test()
{
//Debug.Log(num);//无法调用其他语句块
}
3、变量只能在定义后使用
(二)常量(const)
常量是固定的值,程序运行时不会修改的值,比如:圆周率;
常量和变量类似,但常量在定义时必须赋值,其他时刻无法改变;
常量同样有作用域;
cs
const int a = 2;
//a = 3;常量无法修改
七、算术运算符
cs
int a = 2;
int b = 2;
Debug.Log($"加法:{a+b}");
Debug.Log($"减法:{a-b}");
Debug.Log($"乘法:{a*b}");
Debug.Log($"除法:{a/b}");
cs
//支持混合运算,运算顺序和小学数学一致
int c = (a + b) * (a / b) - a + b;
Debug.Log(c);
使用混合运算时,int和float计算,会把int转为float计算
1、取余
cs
//取余
Debug.Log(4 % 4);//0
Debug.Log(3 % 4);//3
//判断数值奇偶性
Debug.Log(5 % 2);//1 奇数
Debug.Log(4 % 2);//0 偶数
2、自增 自减
cs
//自增1和自减1
int d = 3;
d = d + 1;//4
d++;
Debug.Log(d);//5
d--;
Debug.Log(d);//4
前++是先自加后使用
后++是先使用后自加
八、赋值运算符
cs
int a = 3;
a += 4;//等同于a=a+4,7
a -= 5;//等同于a=a-5,2
a *= 5;//等同于a=a*5,10
a /= 5;//等同于a=a/5,2
a %= 5;//等同于a=a%5,2
九、Bool类型与关系运算符
(一)bool类型
一般用来描述 是与否、真与假、能与不能、正确与错误等情况。
True:是
False:否
(二)关系运算符
cs
string a = "123456qq";
string b = "123456qq";
bool c = (a==b);
Debug.Log(c);
cs
//例子:除了战士,其他职业都可以进入
string A1 = "Warrior";
bool canEnter = A1 !="Warrior";
Debug.Log($"玩家可以进入:{canEnter}");
十、逻辑运算符
1、&&和|| 都会发生短路机制
cs
string a = "1234";
string b = "qwer";
bool UNmame = a == "1234";
bool UPassword = b == "qwer";
bool online = true;
bool Login = UNmame & UPassword & online;
Debug.Log($"玩家是否可以登录:{Login}");
在项目中为了避免更多的运算量,更多的是使用&&和||
只有这两个有短路机制
十一、三目运算符(条件运算符)
1、定义
三目运算符也叫做条件运算符
结果 = 如果条件为真 ? 则为X :否则为Y
2、用法
cs
//如果num小于0则返回0,否则返回他自己
int num = 1002;
num = num < 0 ? 0 : num;
Debug.Log(num);
cs
//如果num小于0则返回0,否则返回他自己
int num = 1002;
num = num < 0 ? 0 : num;
Debug.Log(num);
int num2=num>100?100:num;
Debug.Log(num2);
十二、if 判断语句
if :用来判断条件是否成立,即是否为true
else if : if 不成立,但是没满足我的条件 则执行
else : 以上条件都不满足则执行
注意事项:短路机制;{}作用域
cs
int age = 17;
if (age > 18)//如果18岁
{
Debug.Log($"什么都可以看");
}
else if (age > 16)
{
Debug.Log($"大多数可以看");
}
else if(age > 14)
{
Debug.Log("有一些不能看");
}
else if (age<14)
{
Debug.Log("大多不能看!");
}
十三、枚举类型
1、定义
当某个数据可以预期有确定性的几种结果时,可以使用枚举类型来保存
例如:AI=>待机、攻击、死亡
时间=》星期、月份
游戏状态=》选择英雄、加载界面、战斗中、游戏结束
2、用法
关键字:enum
cs
enum AIState
{
Idle,
Attack,
Die
}
cs
enum AIState
{
Idle,
Attack,
Die
}
public class Hello : MonoBehaviour
{
private void Start()
{
AIState state= AIState.Idle;
state=AIState .Attack;//切换到攻击状态
//如果AI是待机状态
if (state == AIState.Idle)
{
Debug.Log("播放待机动作");
}
else if (state == AIState.Attack)
{
Debug.Log("播放攻击动作");
}
else if(state == AIState.Die)
{
Debug.Log("播放死亡动画");
}
int dex = (int)state;//使用显示转换 就是强转
Debug.Log(dex);
}
}
十四、switch判断语句
1、和枚举配合在一起
cs
enum AIState
{
Idle,
Attack,
Die
}
把这个复制进来,然后鼠标点击旁边 会自动生成对应的case语句
cs
int num = 1;
switch (num)
{
case 0:
case 1:
break;
case 2:
break;
default:
break;
}
这里相当于case0和case1逻辑在一起
把break去掉就会按顺序执行下去 直到遇见break
十五、for循环语句
循环执行n次代码
cs
for (int i = 0; i < 3; i++)
{
Debug.Log(i);
}
cs
//从1+到100 等于多少
int Res = 0;
for (int i = 0;i <=100;i++)
{
Res += i;
Debug.Log(Res);
}
Debug.Log(Res);
十六、While循环语句
如果满足循环条件 就一直执行
注:while循环的判断条件不能一直是 true ;为了避免死循环
1、变种 do While
至少执行一次,就是这个的特点
十七、函数的基本使用
1、封装
就是把代码封装成一个函数,在哪里用,就调用它
cs
private void Start()
{
Func();
Func();
}
private void Func()
{
for (int i = 0; i <=100; i++)
{
Debug.Log(i);
}
}
在这里,就是把Func封装成了一个类。
2、传参
在方法中传入对应的参数
cs
private void Start()
{
Func(100,"分数");
}
private void Func(int a,string info)
{
for (int i = 0; i <=100; i++)
{
Debug.Log($"{info}:{i+a}");
}
}
函数的参数是形参 而调用的方法参数是实参
实参和形参没有关系
这里形参300 实参100
十八、函数重载
同名不同参数的函数
1、参数数量不相同
cs
int Add(int a,int b)
{
int res = a + b;
return res;
}
int Add(int a,int b,int c)
{
return 1;
}
2、参数类型不相同
cs
int Add(int a,int b)
{
int res = a + b;
return res;
}
int Add(int a,string b)
{
int res=a+int.Parse(b);
return res;
}
这里的int.parse 是转为int类型的方式
十九、函数的ref和out关键字
ref:通常情况下,形参和实参只是值一样,但是并不是同一个变量, 如果通过ref则可以视为一个变量
out:函数的返回值只有一个,如果需要两个,则可以使用
cs
private void Start()
{
int a = 3;
Function(a);//实参
Debug.Log($"实参:{a}");
}
void Function(int a)//形参
{
a += 1000;
Debug.Log($"形参:{a}");
}
此时 在形参中加入关键字ref 形参和实参就会有影响
cs
private void Start()
{
int a = 3;
Function( ref a);//实参
Debug.Log($"实参:{a}");
}
void Function( ref int a)//形参
{
a += 1000;
Debug.Log($"形参:{a}");
}
cs
//需求:
//1、请求登录,提供一个账号
//2、如果有此账号,返回True,并且返回密码
string password;
CheckLogin("Joker", out password);
cs
/// <summary>
/// 检查登录
/// </summary>
/// <returns></returns>
bool CheckLogin(string userName,out string password)
{
bool canLogin = userName == "Joker";
if (canLogin)
{
password = "123";
}
else
{
password = null;
}
return canLogin;
}
如果在调用这个方法的时候没有传入参数,按照形参默认值优先
如果调用这个方法,只有一个实参,也不会出问题,实参没有定义的值,按照形参来判断
注:默认的形参没有值,那么实参就必须定义值