目录
入门语言(C#)C# 基础概念讲解:
(主要介绍游戏开发中常用的一些概念或基基础知识,本篇文章会慢慢完善和加入一些例子,让大家更好的理解游戏开发需要掌握哪些知识就可以,不理解的可以提出来)
1.class与struct
1.最小编程个体,方法必须写在类中,万事万物皆可定义
2:class实例的赋值,赋的是引用地址,struct实例的赋值,赋的是值(内存的拷贝)
3:class作为参数类型传递,传递的是引用地址,struct作为参数类型传递,传递的是值,除非你使用ref;
4: new 操作符,class是在堆上分内存配,而结构体是用变量的内存,结构体定义在哪里,内存就分配在哪里;
内存模型
1: 代码段,数据段, 堆,栈
2: 函数指令/常量字符串存放在代码段上 全局变量 存放在数据段上
3:堆: 复杂对象实例通过new 分配在堆上;
4: 局部变量存放在栈上,随着函数返回,变量内存回收;
class
1:定义一个类: 权限 class 类的名称;
2:类的数据成员 权限 类型 名称;
3: 类的成员函数 权限 返回类型 函数名称(参数1, 参数) 没有任何返回值为void
4: 类的实例化与类的引用
struct
1:传值和引用; 基本数据类型为传值,复杂的类传引用;
2: 不是基本数据类型,又希望方便的传值 --- struct
3: 结构体有数据成员,成员函数;
4: 不能重载默认的构造函数,默认构造函数把所有的初始化为0;
5: 可以重载不同参数的构造函数;
6: 结构体的变量定义在哪里,那么内存就分配在哪里;
7: 结构体的new 不额外的创建内存,使用=左边的内存;
8: 结构体赋值和传参,内存都拷贝一份;
9: 结构体参数传引用 ref修饰;
继承
1: 冒号: 基类名字
2: 子类 -- 父类
3: 派生类--基类
4: 子类调用基类数据成员; public, protected权限才可以
5: 子类调用基类的成员函数; public, protected权限才可以
重载
1:子类重新实现了基类有的方法--->重载
2:子类调用基类的同样名字的方法,调用的是子类自己的
3: base.基类的方法名字
2.系统属性(int string Enum):
基础属性,系统预定义的类型
get与set
1: 成员变量,如果只读不能写怎么办? public一公开,可读可写;
2: 给这个成员定义一个属性, 属性 读/写访问器
3: value 指的是别人在外部设置的值,在set里面使用value替代;
4: get, set也可以有权限修饰符号;
public int signNum
{
get
{
return PlayerPrefs.GetInt(PlayerPrefsItem.SignNumPrefs.ToString(),0);
}
set
{
PlayerPrefs.SetInt(PlayerPrefsItem.SignNumPrefs.ToString(), value);
}
}
3.变量:
自定义的临时或全局属性,标记用,值可在内存中随意改变或独取
定义一个变量: 基本变量和引用变量 只在函数类有效
基本数据类型
1:字节与bit
2:权限 数据类型 变量名称;
3: 基本数据类型:
(1)整形 sbyte/byte short/ushort int/uint long/ulong
(2)浮点数: float (32bit), double (64)
(3) bool 逻辑类型: true, false
(4) char类型 16位unicode
(5) 复杂类型的引用变量,属于基本变量存放复制对象引用。64位的.net为 64bit, 32位.net为32位
string
(1):string.Format 格式化生成字符串
(2): string对象判断字符串是否相同 Equals
(3):变大写 ToUpper, ToLower
数组
1: 存放同样类型的一组数据
2: 可以使用名字[索引]访问, 索引从0开始;
3: new int[10];
4: 数组的访问与遍历
4.方法:
实现某一功能的思路或具体逻辑
指令语句都在函数里面执行;
成员函数的调用: 对象的实例.函数名称(参数);
return 语句 返回值或对象的引用给调用者;
多态
1: 一个函数的多种形态,函数名相同参数不一样;
2:实际上是两个函数,不纠结;
构造函数
(1): 函数名称和类的名字一样的函数;
(2): 构造函数可以有多个参数不一样的形态;
(3): 继承自MonoBehaviour的对象不要去 重载它的构造函数;
(4): new 构造函数(参数, 参数);
虚函数
1: 虚方法前不允许有static,abstract,或override修饰符
2: 虚方法不能是私有的,因此不能使用private修饰符
3: override 基类重写这个方法
4: 基类引用保存子类实例;
5.内存列表:
实现对属性的批量操作 (array/List/dictionary/stack)Add /Remove)
6.逻辑判断语句:(if else/switch )
1:if()
2: if () {} else {}
3: if () {}else if {} else {}
7.常用系统操作符:|| && == != <= >
(1): 赋值表达式; (2): + - * /表达式 ++, -- , 取余%; (3):比较表达式 <, <=, >, >=, ==; (4): 逻辑表达式 &&, ||; (5):类型强转
8.switch 和状态机
switch(变量) {
case 常量1: break;
....
default: break; }
9.for/foreach
1.for(初始条件; 循环判断; 循环迭代) {}
从哪开始循环
循环进入的条件
下个循环最终要执行的索引
2:while() {}
3: do {} while();
4: continue; 跳过单次
5: break; 跳出循环
10.其它常用
static
1: static 类的静态方法;
2: static 类的静态变量;
const readonly
1:const 修饰的类的成员变量,在编译的时候确定的常量,运行的不可更改
2:readonly 实例化时确定的常量,可以在构造函数里面修改,后面就再也无法修改了;
泛型编程
1: 泛型类 2: 泛型成员方法
命名空间
1: namespace my_name {}
2: using namespace my_name;
其它
随机数的方法使用
类的多态性
文件的输入输出
异常处理
11.mathf 数学函数简要示例
Mathf.Sqrt(开平方):
简单的说,就是比较某两个东西,我们首先要确定一个参照系。
所以我们一般认为比较两个量,必须要在相同单位的情况下比较,这往往是符合客观世界的,比如面积和长度的比较是没有实际意义的。
比如100平方米的房子和15米的长度如何比较?
如果用100平方米开方,得到10米,就可以和15米的长度进行比较了。
但是你肯定会问这有什么道理呢?
确实,这只是为了解决问题所设定的一种路径,一种方式,一种工具。其本身并没有什么道理可言,只是在某种前提下合理即可。
或者简单的理解为,这是人为规定的。
Math.atan2(反正切计算得到弧度):
Math.atan2()接受两个参数x和y,方法如下:
angel=Math.atan2(y,x)
x 指定点的 x 坐标的数字。
y 指定点的 y 坐标的数字。
计算出来的结果angel是一个弧度值,也可以表示相对直角三角形对角的角,其中 x 是临边边长,而 y 是对边边长。
a=angel*180/Math.PI//将弧度 转换为角度
练习实例:
1.随机生成姓名(百家姓或起名软件)
2.打飞机游戏
生成大量随机的怪物
碰撞检测(非物理)
UGUI:
背景的循环移动(限2张图)
编码命名建议:
它不该着眼现在,还能面向未来
共同的任务一定要抽象出来,善用艺术和修辞手法
要学会表达意图,而非陈述事实
避免使用繁琐的组合词,简短而有力,诗意而优美
1: 微软使用的匈牙利命名法; 2: java使用的驼峰命令法; 3: linux 使用的命名法; 4: 无所谓,项目规定有哪个就用哪个