一、c#基础

一、控制台输出和代码注释

(一)控制台输出

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;
}

如果在调用这个方法的时候没有传入参数,按照形参默认值优先

如果调用这个方法,只有一个实参,也不会出问题,实参没有定义的值,按照形参来判断

注:默认的形参没有值,那么实参就必须定义值

相关推荐
la_vie_est_belle3 小时前
《Cocos Creator游戏实战》非固定摇杆实现原理
游戏·cocos creator·游戏开发·cocos·非固定摇杆
Thomas_YXQ3 小时前
Unity3D Huatuo技术原理剖析详解
unity·unity3d·游戏开发·性能调优·热更新
小板凳-BGM4 小时前
C# 第二阶段 modbus
开发语言·ui·c#
黄金小码农4 小时前
c# 2024/12/25 周三
开发语言·c#
geovindu5 小时前
CSharp: Oracle Stored Procedure query table
数据库·oracle·c#·.net
火云洞红孩儿5 小时前
基于AI IDE 打造快速化的游戏LUA脚本的生成系统
c++·人工智能·inscode·游戏引擎·lua·游戏开发·脚本系统
yngsqq6 小时前
cad c# 二次开发 ——动态加载dll 文件制作(loada netloadx)
c#
虾球xz6 小时前
游戏引擎学习第59天
学习·游戏引擎
zh路西法6 小时前
【C++决策和状态管理】从状态模式,有限状态机,行为树到决策树(二):从FSM开始的2D游戏角色操控底层源码编写
c++·游戏·unity·设计模式·状态模式
soragui7 小时前
【ChatGPT】OpenAI 如何使用流模式进行回答
linux·运维·游戏