游戏开发笔记(四)

"开发笔记"

Posted by A-SHIN on December 18, 2017

“Yeah It’s on. ”

前言

接前篇早些年游戏开发工作中的笔记,放上来以防丢失。有些规则现在可能不适用了(如一些是U3D4早些版本的记录)。有些因为水平有限,有理解错误的地方,望指正!~
笔记比较乱,没整理

正文

UnityEngine

GameObject : Base class for all entities in Unity scenes.
Component : Base class for everything attached to GameObjects.
MonoBehaviour : MonoBehaviour is the base class from which every Unity script derives.
MonoBehaviour继承自Component。GameObject包含各种Component(默认包含Transform)
只有继承自MonoBehaviour的类才能挂到GameObject上(除默认包含的Transform继承自Component)

编辑器模式下GetComponent时,如果Component不存在,继承自MonoBehaviour的返回null,U3D自带的Component返回重载输出null字符串的非空对象。
Component初始状态为unenable(脚本未勾上)时,Awake也会调用。当GameObject初始状态为unactive(游戏对象没勾上)时,GameObject下的所有Component脚本都不会调用Awake。

Camera.viewport 0<=x<=1 0<=y<=1
各Camera下的world坐标可通过 viewport screen world坐标系相互转换计算而来(例如:场景相机下角色的UI相机下的血条 同步关系)
Component的OnEnable也会受所在GameObject的active影响

NGUI

在UIGrid上添加UICenterOnChild脚本可以使Item居中
循环播放可使用UIWrapContent代替UIGrid
UIScrollView为防止缝隙拖动不了,可在UIScrollView(防止随Clip offset一起移动)加一个整体的BoxCollider(还需添加UIWidget组件不然BoxCollider不起作用)并添加UIDragScrollView组件关联该UIScrollView。
UIEventListener以SendMessage形式响应回调,包含UIButton中OnClick等功能。制作Button两者可选其一。原理都是所在的GameObject.SendMessage(methodName, …);

Lua

LUA不是通过table.pack而来的table传入table.unpack时,需要指明unpack的后两个参数。不然遇到nil会忽略后续内容

C#

C# long:8字节 char:2字节 bool:1字节
C#事件不能在其他类里调用,事件在其他类里注册用+=,不能用= string 是 C# 中的类,String 是 .net Framework 的类(在 C# IDE 中不会显示蓝色) C# string 映射为 .net Framework 的String 如果用 string, 编译器会把它编译成 String,所以如果直接用 String 就可以让编译器少做一点点工作。

C#中只能使用指向值类型的指针
在 C# 中,结构体是值类型数据结构。类是引用类型。枚举是值类型。结构不支持继承。
结构可定义构造函数,但不能定义析构函数。但是,不能为结构定义默认的构造函数。默认的构造函数是自动定义的,且不能被改变。
当使用 New 操作符创建一个结构对象时,会调用适当的构造函数来创建结构。与类不同,结构可以不使用 New 操作符即可被实例化。如果不使用 New 操作符,只有在所有的字段都被初始化之后,字段才被赋值,对象才被使用。

类和结构体的默认访问标识符是 internal,成员的默认访问标识符是 private。枚举的默认访问标识符是 internal,成员的默认访问标识符是 public。接口默认是internal类型的,也可以显示的定义为public类型,不允许是其他访问类型,接口中不能定义成员变量,接口中的方法默认为public的访问权限,但是不能显示的定义任何访问类型。抽象类中必须有一个以上的抽象方法,抽象方法可以是public、internal、protected,不能是private的访问类型。

B继承自A,C继承自B。A有函数virtual F B有函数override F C有函数override F。 A或者B或者C类型引用都能调用到C对象的多态F。
起始父类必须使用virt,子类必须使用override重写(C++用virtual)。
从类型的F开始到对象F过程中,类型F可以是virtual或override(类型定义不一定是起始父类,起始父类必须是virtual),其余必须是override,若中间出现virtual则会调用该virtual之前的那个override F(若之前无override则调用类型的virtual F)。

C# 提供了一个特殊的数据类型,nullable 类型(可空类型),可空类型可以表示其基础值类型正常范围内的值,再加上一个 null 值。

int? i = 3 // 等同于 Nullable<int> i = new Nullable<int>(3);  
int ii; // 默认值0  
int? iii; // 默认值null  
double? num1 = null;  
double? num2 = 3.14157;  
double num3;  
num3 = num1 ?? 5.34;      // num1 如果为空值则返回 5.34  

C#多维数组:

int[,] a = new int[5, 2] { {0,0}, {1,2}, {2,4}, {3,6}, {4,8} };  
int n = a[0,0];  

C#交错数组:

// 其中,scores 是一个由两个整型数组组成的数组 -- scores[0] 是一个带有 3 个整数的数组,scores[1] 是一个带有 4 个整数的数组。  
int[][] scores = new int[2][]{new int[]{92,93,94},new int[]{85,66,87,88} };	

C#不支持多重继承。但是可以使用接口来实现多重继承
不能在抽象类外定义抽象方法
接口声明默认是 public 的

using的用法:

  1. using指令:引入命名空间
    using System;
    using Namespace1.SubNameSpace;
    
  2. using static 指令:指定无需指定类型名称即可访问其静态成员的类型
    using static System.Math;
    var = PI; // 直接使用System.Math.PI
    
  3. 起别名
    using Project = PC.MyCompany.Project;
    
  4. using语句:将实例与代码绑定
    using (Font font3 = new Font("Arial", 10.0f),
             font4 = new Font("Arial", 10.0f))
    {
     // Use font3 and font4.
    }
    

    代码段结束时,自动调用font3和font4的Dispose方法,释放实例。

类中的静态变量只会存在一份(在类型对象中),不管类产生多少个实例对象。(CLR via C# page 96)

后记