Unity游戏开发之C#快速入门
C#是微软团队在开发.NET框架时开发的,它的构想接近于C、C++,也和JAVA十分相似,有许多强大的编程功能。
个人感受是C#吸收了众多编程语言的优点,从中可以看到C、C++、Java、Javascript、python的影子,设计思想都是相通的(过段时间一定要看看设计模式),对比迁移地学习基本只需要记关键字、语法和包的用法。我是为了unity游戏开发课程学的,不是很深入,某些细节可能也没有涉及到。 就先复习了以前学C++、java的笔记,然后对照着简单学了C#,会重点学unity中用到的包。
1.C#程序结构
C# 中的关键组织结构概念包括程序、命名空间、类型、成员和程序集。
一个C#版HelloWorld直观感受一下。
using System; //包含命名空间
namespace HelloWorldApplication //声明一个命名空间
{
class HelloWorld //类声明
{
static void Main(string[] args) //Main入口函数
{
/* 我的第一个 C# 程序*/
Console.WriteLine("Hello World"); //输出
Console.ReadKey();
}
}
}
与 Java 不同,文件名可以不同于类的名称。
2.数据类型、类型转换
- 值类型 (从System.ValueType中派生)
bool、byte、char、decimal、double、float、int、long、sbyte、short、uint、ulong、ushort、结构体struct、枚举enum - 引用类型
引用类型不包含存储在变量中的实际数据,而是包含对变量的引用。
内置的引用类型有:object、dynamic 和 string。
自定义的有:类class C {...}、接口interface I {...}、委托delegate int D(...)、数组int[]和int[,]。
对象类型变量的类型检查是在编译时发生。
动态类型变量的类型检查是在运行时发生。
@引号的字符串会将转义字符(\)当作普通字符,可以任意换行,换行符及缩进空格都计算在字符串长度之内。
字符串的占位符为{},如:String.Format(“{0},{1}”,c,d); - 指针类型
指针类型变量存储另一种类型的内存地址。
例如:char* cptr; - 可空类型
null是引用类型变量的默认值,null不允许被赋给值类型的变量,但有时我们希望值类型的数据可以为null,就有了可空类型。int a = null; // 非法
int? a = null; // 合法,可空类型
Nullable<int> i = new Nullable<int>(3);//可空类型
合并运算符(??)定义了一个预设值,以防可空类型的值为null。
如:double? num1 = null;
double num3 = num1 ?? 5.34; // num1 如果为空值则返回 5.34
类型转换如:i = (int)d;i.ToString();s.ToBoolean();
C#的运算符,判断、循环语句和C++的语法基本一致,不做过多说明。
3.方法、类、接口、泛型
一个 访问修饰符 定义了一个类成员的范围和可见性。
C# 支持的访问修饰符如下所示:
public:所有对象都可以访问;
private:对象本身在对象内部可以访问;
protected:只有该类对象及其子类对象可以访问
internal:同一个程序集的对象可以访问;
protected internal:访问限于当前程序集或派生自包含类的类型。
C# 中定义方法:
<Access Specifier> <Return Type> <Method Name>(Parameter List)
{
Method Body
}
C#中的类和java是很像的,不过继承的时候用的:,而不是extends。
类中也有构造函数、析构函数、静态成员(static)。
class Line
{
private double length; // 线条的长度
public Line() // 构造函数
{
Console.WriteLine("对象已创建");
}
~Line() //析构函数
{
Console.WriteLine("对象已删除");
}
public void setLength( double len )
{
length = len;
}
}
类的继承:
class <派生类> : <基类1>,<基类2>,...
{
...
}
接口的继承和实现也是用的冒号:
interface IMyInterface : IParentInterface
{
}
class InterfaceImplementer : IMyInterface
{
//接口中方法的实现
}
泛型:
using System.Collections.Generic;
GenericList<float> list1 = new GenericList<float>();
C#的泛型和C++模板类似,但也有不同
泛型可以通过使用 where 上下文关键字指定约束。
4.域(Field)、属性(Peoperty)、索引器(Indexer)
域和属性的区别
| 区别 | 属性 | 域 |
|---|---|---|
| 逻辑性 | 逻辑字段,在改变字段时 能改变对象的其他一些状态 |
不经过逻辑处理 |
| 存储性 | 不占用实际内存 | 占内存空间及位置 |
| 访问性 | 由get、set访问器决定读写属性 | 由访问修饰符决定 |
| 安全性 | 增加了数据的安全性 | 不太安全 |
为了实现对字段的封装,保证字段的安全性,而产生了属性,其本质是方法,通常是配合使用的,如下:
class Student
{
private string name = "not known";
// 声明类型为 string 的 Name 属性
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
}
索引器
索引器(Indexer)允许一个对象可以像数组一样被索引。
和属性类似,可使用 get 和 set 访问器来定义索引器,而索引器返回或设置对象实例的一个特定值。
5.委托、匿名函数、事件
委托
委托可以理解为函数指针,是对函数原型的包装。
但相比于函数指针,委托面向对象,类型更安全,有多播的功能。
通过委托,可以将方法视为可分配给变量并可作为参数传递的实体。
例如:
- 申明委托:
delegate void TestDelegate(string s);
可以再任何地方声明委托,可以带访问修饰符。
委托不关心引用的方法的类,只关心引用的方法是否与委托有相同的参数和返回类型。 - 实例化委托:
TestDelegate testdelA = new TestDelegate(M);
用某个方法实例化这个委托,也就是说,使函数指针指向一个方法。 - 调用委托:
testdelA("Hello"); - 委托可以多播
委托间可以使用+、-来组合、移除,委托判等是根据它引用的方法判断。 - 泛型委托:
delegate T NumberChanger<T>(T n);
匿名函数与Lambda表达式
匿名方法(Anonymous methods) 提供了一种传递代码块作为委托参数的技术。
匿名方法没有名称只有主体,不需要指定返回类型,它是从方法主体内的 return 语句推断的。
匿名函数与委托的使用步骤相同,实例化时格式不同,格式如下:
委托名 实例变量 =delegate(形参列表){方法体};
Lambda表达式也是匿名函数,语法更加简洁:
(参数列表) => {方法体}
事件
事件使用 发布-订阅(publisher-subscriber) 模型。
在类的内部声明事件,首先必须声明该事件的委托类型。例如:
public delegate void BoilerLogHandler(string status);
然后,使用 event 关键字声明事件本身:
public event BoilerLogHandler BoilerEventLog;
6.C#常用类库
System.Collections
集合(Collection)类是专门用于数据存储和检索的类。常用的有:
| 集合类 | 常用方法 |
| 动态数组 ArrayList |
Add(item)、Clear()、Contains()、IndexOf()、 Remove()、Sort()、Reverse() |
| 哈希表 Hashtable |
Add(key,value)、Clear()、Remove(key)、 ContainsKey(key)、ContainsValue(value) |
| 堆栈 Stack |
Clear()、Contains()、Peek()、 Pop()、PushToArray() |
| 队列 Queue |
Clear()、Contains()、Dequeue()、 Enqueue()、ToArray()、TrimToSize() |
| 点阵列 BitArray |
|
| 排序列表 SortedList |
|
个人笔记型博客,仔细学习可移步C#官方文档或菜鸟教程-C#教程。
Unity游戏开发之C#快速入门的更多相关文章
- Unity游戏开发之“屏幕截图”
原地址:http://sygame.lofter.com/post/117105_791680 在unity游戏开发中,可能会遇到在游戏中截屏的效果.这儿提供两种截屏方法.(方法二提供显示截图缩略图代 ...
- unity游戏开发之entitas框架
框架介绍 entitas是一个超快.超轻量的c# Entity-Component-System (ECS)框架,专门为Unity引擎设计.提供内部缓存和高速的组件访问,经过精心设计,可以在垃圾收集环 ...
- Unity游戏开发之“分层碰撞”
有没有同学遇到过这样的情况:在游戏开发3D游戏中非经常见,比方让一个物体能穿过一个物体 而还有一个物体不能穿过这个物体,并且3个物体都不能穿过地面.在unity中这样的情况的处理是通过分层碰撞来解决的 ...
- 全栈开发之HTML快速入门(一)
一.HTML 是什么? HTML 指的是超文本标记语言 (Hyper Text Markup Language) HTML 不是一种编程语言,而是一种标记语言 (markup language) 标记 ...
- unity游戏开发之NGUI的UISprite染色
游戏的UI开发中常常会遇到染色问题.比如button失效变灰的效果,同一个道具通过策划表配的颜色值染上红绿蓝紫等颜色,效果例如以下 最笨最挫的方法当然是让美术多出几个资源图.这种一个缺点是浪费资源,在 ...
- [整理]Unity3D游戏开发之Lua
原文1:[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(上) 各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我地博客地址是blog.csdn.net/qinyuanpei.如果 ...
- Cocos2d-x 3.x游戏开发之旅
Cocos2d-x 3.x游戏开发之旅 钟迪龙 著 ISBN 978-7-121-24276-2 2014年10月出版 定价:79.00元 516页 16开 内容提要 <Cocos2d-x ...
- 【转载】浅谈游戏开发之2D手游工具
浅谈游戏开发之2D手游工具 来源:http://www.gameres.com/459713.html 游戏程序 平台类型: iOS Android 程序设计: 其它 编程语言: 引擎/SDK ...
- [Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘终结篇:UniLua热更新全然解读
---------------------------------------------------------------------------------------------------- ...
随机推荐
- [Luogu 2261] CQOI2007 余数求和
[Luogu 2261] CQOI2007 余数求和 这一定是我迄今为止见过最短小精悍的省选题了,核心代码 \(4\) 行,总代码 \(12\) 行,堪比小凯的疑惑啊. 这题一看暴力很好打,然而 \( ...
- [Luogu 2221] HAOI2012 高速公路
[Luogu 2221] HAOI2012 高速公路 比较容易看出的线段树题目. 由于等概率,期望便转化为 子集元素和/子集个数. 每一段l..r中,子集元素和为: \(\sum w_{i}(i-l+ ...
- PHP系统编程--02.PHP守护进程化
什么是守护进程? 一个守护进程通常补认为是一个不对终端进行控制的后台任务.它有三个很显著的特征:在后台运行,与启动他的进程脱离,无须控制终端.常用的实现方式是fork() -> setsid() ...
- Spring整合Quartz分布式调度(山东数漫江湖)
前言 为了保证应用的高可用和高并发性,一般都会部署多个节点:对于定时任务,如果每个节点都执行自己的定时任务,一方面耗费了系统资源,另一方面有些任务多次执行,可能引发应用逻辑问题,所以需要一个分布式的调 ...
- spring mvc 提供的几个常用的扩展点
转载 :http://blog.csdn.net/gufachongyang02/article/details/43836105 这是spring3 mvc的核心流程图: SpirngMVC的第 ...
- linux系统引导流程
1.固件:硬件和软件结合.加电自检是我们按下电源会检测硬件像cpu.内存.网卡等信息.(从硬件层次检测硬件是否可用) 固件设置实例:设置时间 软件时间和硬件时间: [root@VM_0_12_cent ...
- js作用域与上下文
作用域:与调用函数,访问变量的能力有关 作用域分为:局部和全局(在局部作用域里可以访问到全局作用域的变量,但在局部作用域外面就访问不到局部作用里面所设定的变量) 上下文:与this关键字有关 是调用当 ...
- 4.FireDAC组件快照 二
TFDUpdateSQL 生成添加,删除,修改SQL语句 TFDMetaInfoQuery 查询数据源信息 TFDEventAlerter 负责处理数据库事件通知 使用TFDEventAlerter类 ...
- 获取windows 网卡GUID和ip信息
# coding: UTF-8 import _winreg GUID=dict() num = 0 netCfgInstanceID = None hkey = _winreg.OpenKey(_w ...
- echarts断点连线问题 终级
/** * * 测试关系图 graph type* */var coors1 = [['1', 0],['2', 182],['5', 290],['6', 330],['7', 310],['10' ...