Unity入门——重要组件和Api

最小单位GameObject

成员变量

1
2
3
4
5
6
7
8
9
10
11
12
print(this.gameObject.name);
this.gameObject.name = "带土";
//是否激活
print(this.gameObject.activeSelf);
//是否静态
print(this.gameObject.isStatic);
//层级
print(this.gameObject.layer);
//标签
print(this.gameObject.tag);
//transform
print(this.gameObject.transform.position);

GameObject中的静态方法

只要得到了一个GameObject对象,就可以得到它身上的所有脚本信息。

1
2
3
4
//创建自带几何体
GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube);
obj.name = "11";
obj.GetComponent();

查找对象

1
2
3
4
5
6
7
8
9
10
11
12
//通过对象名字查找(无法找到失活对象)
GameObject obj = GameObject.Find("xxx");
if(obj != null)
{
print(obj.name);
}
//通过tag查找对象
GameObject obj = GameObject.FindWithTag("Player");
if(obj != null)
{
print(obj.name);
}

查找多个对象

1
2
GameObject[] obj = GameObject.FindGameObjectsWithTag("Player");
print(obj.Length);

实例化对象(克隆对象)的方法

1
2
3
4
public GameObject obj;
GameObject.Instantiate(obj);
//如果继承了MonoBehavior,可以不用写GameObject
Instantiate(obj);

删除对象的方法(一般在下一帧删除)

1
2
3
4
5
6
7
8
GameObject.Destroy(obj);
//延迟删除,单位是秒
GameObject.Destroy(obj,5);
//删除脚本
GameObject.Destroy(this);
//瞬间移除,并且释放内存
GameObject.DestroyImmediate(obj);
//如果继承了MonoBehavior,可以不用写GameObject

一般来说换场景时之前的场景就会被自动移除,可以让他不移除
过场景不移除

1
2
3
GameObject.DontDestroyOnLoad(this.GameObject);
//一般都是传入自己依附的对象,填谁谁就不被移除
//如果继承了MonoBehavior,可以不用写GameObject

GameObject中的成员方法

创建空物体

1
2
3
4
GameObject obj = new GameObject();
GameObject obj1 = new GameObject("newGameObject");
//添加脚本
GameObject obj2 = new GameObject("newGameObject1", typeof(xxx));

为对象添加脚本

1
2
xxx x = obj.AddComponent(typeof(xxx)) as xxx;
xxx x1 = obj.AddComponent<xxx>();

标签比较

1
2
3
4
5
6
7
8
if(this.gameObject.CompareTag("Player"))
{

}
if(this.gameObject.tag == Player)
{

}

设置激活失活

1
2
obj.SetActive(false);
obj.SetActive(true);

次要了解的方法,不建议使用

1
2
3
//广播通知自己执行什么行为
this。gameObject.SendMessage("TestFun");
//命令自己去执行该函数,会在自己身上挂载的所有脚本中去执行这个名字的脚本

时间相关Time

Time主要用于游戏中参与位移、计时、时间暂停等

时间缩放比例

时间停止

1
2
3
4
Time.timeScale = 0;//暂停
Time.timeScale = 1;//恢复正常
Time.timeScale = 2;//2倍速

帧间隔时间

帧间隔时间就是最近的一帧用了多长时间(s)
主要是用来计算位移的:
如果希望游戏暂停了就不移动了,就用deltatime。
如果希望不收暂停影响就用unscaleddeltatime。

1
2
3
4
5
//受scale影响
print(Time.deltaTime);

//不受scale影响的帧间隔时间
print(Time.unscaledDeltaTime);

游戏开始到现在的时间

1
2
3
4
//收scale影响
print(Time.time);
//不受scale影响
print(Time.unscaledTime);

物理帧间隔时间

1
2
3
4
//收scale影响
print(Time.fixedDeltaTime);
//不受scale影响
print(Time.fixedUnscaleDeltaTime);

帧数

从游戏开始到现在跑了多少帧

1
print(Time.frameCount);

TransForm

Vector3

Vector3主要是用来表示三维坐标系中的一个点或者一个向量的。

1
2
3
4
5
6
7
8
Vector3 v = new Vector3();
v.x = 10;
v.y = 10;
v.z = 10;
//只传两个z默认是0
Vector3 v = new Vector3(10, 10);
//一步到位
Vector3 v = new Vector3(10, 10, 10);
1
2
3
4
Vector3 v1 = new Vector3(1. 1. 1);
Vector3 v2 = new Vector3(1. 1. 1);
print(v1 + v2);
print(v1 - v2);

常用代码

1
2
3
4
5
6
7
8
print(Vector3.zero);//000
print(Vector3.right);//100
print(Vector3.left);//-100
print(Vector3.up);//010
print(Vector3.down);//0-10
print(Vector3.forward);//001
print(Vector3.back);//00-1
Vector3.Distance(v1,v2);

位置

相对世界坐标系的位置

1
this.transform.position;

相对于父对象

1
this.transform.localposition;

不能单独改变某一个位置的值,只能整体进行赋值

1
2
3
4
5
6
7
8
9
//直接赋值
this.transform.position = new Vector3(10, 10, 10);
this.transform.position = new Vector3(10, this.transform.position.y, this.transform.position.z);
//先取出来再赋值
Vector3 vpos = this.transform.position;
vpos.x = 100;
vpos.y = 100;
vpos.z = 100;
this.transform.position = vpos;

对象当前的朝向

1
2
3
//对象当前的面朝向
this.transform.forward;
同理可得其他的朝向

位移

1
2
//当前位置 + 变换的位置 = 最终的位置
this.transform.position = this.transform.position + this.transform.forward * 1 * Time.deltaTime;

API

1
2
3
4
5
6
7
8
9
//参数一表示唯一多少,参数二表示相对坐标系,默认该坐标系是相对自己的面朝向
//相对于世界的z轴
this.transform.Translate(Vector3.forward * 1 * Time.deltaTime, Space.World);
//相对于自己坐标下向自己面朝方向移动
this.transform.Translate(this.transform.forward * 1 * Time.deltaTime, Space.Self);//一定不要这样写
//相对于世界坐标系,朝自己面朝方向移动
this.transform.Translate(this.transform.forward * 1 * Time.deltaTime, Space.World);
//相对于自己坐标下向z轴移动
this.transform.Translate(Vector3.forward * 1 * Time.deltaTime, Space.Self);

角度和旋转

角度

1
2
3
4
5
6
//相当于世界坐标系角度
this.transform.eulerAngles;
//相对父对象角度
this.transform.localEulerAngles;
//不能单独设置xyz,要一起设置
this.transform.eulerAngles = new Vector3(10,10,10);

旋转

1
2
3
4
5
6
7
8
9
10
11
12
//自传
this.transform.Rotate(new Vector3(0,10 * Time.deltaTime, 0));
//其实有两个参数,第二个默认不传是按照自己的坐标系进行旋转
this.transform.Rotate(new Vector3(0,10 * Time.deltaTime, 0), Space.World);
this.transform.Rotate(new Vector3(0,10 * Time.deltaTime, 0), Space.Self);

//绕某一轴转动
this.transform.Rotate(Vector3.up, 10 * Time.deltaTime, Space.World);

//相对于某个点转
//第一个参数表示绕某个点,第二个参数表示该点的哪个轴,第三个参数表示旋转角度速率
this.transform.RotateAround(Vector3.zero, Vector3.up, 10 * Time.deltaTime);

缩放和看向

缩放

1
2
3
4
5
6
7
8
//相对世界坐标系缩放大小
this.transform.lossyScale;
//相对于自己缩放大小(本地)
this.transform.localScale;
//缩放不能改动xyz,只能一起改,(相对于世界坐标系的缩放大小只能得到,不能改)
//缩放没有Api只能自己改
this.transform.localScale = new Vector3(3, 3, 3);
this.transform.localScale += Vector3.one * Time.deltaTime;

看向

1
2
3
4
5
public transform lookAtObj;
//让目标面朝向(z轴)看向某个点
this.transform.LookAt(Vector3.zero);
//看向一个对象
this.transform.LookAt(lookAtObj);

父子关系

获取和设置父对象

1
2
3
4
5
6
7
8
9
10
//获取父对象
this.transform.parent.name;
//设置父对象
this.transform.parent = null;//断绝父子关系
this.transform.parent = GameObject.Find("xxx").transform;
//Api
this.transform.SetParent(null);
this.transform.SetParent(GameObject.Find("xxx").transform);
//第二个参数表示是否保留原位置和信息
this.transform.SetParent(GameObject.Find("xxx").transform, true);

抛妻弃子

1
2
//可以让父对象断绝自己的所有一级儿子的关系,但是无法影响儿子和孙子的关系
this.transform.DetachChildren();

获取子对象

1
2
3
4
5
6
7
8
9
10
11
//按名字查找儿子。能找到失活的对象
this.transform.Find("xxx");
//遍历儿子
//如何得到有多少个儿子,失活的儿子也算数量
int t = this.transform.childCount;
//通过索引号得到自己的儿子
this.transform.GetChild(0);//填儿子的编号,不能超出数量范围
for(int i = 0; i < t; i++)
{

}

儿子的操作

1
2
3
4
5
6
7
8
9
10
11
//判断自己的爸爸是谁
public Transform son;
spn.IsChildOf(this.transform);//返回类型是bool
//得到自己作为儿子的编号
print(son.GetSiblingIndex());
//把自己设置成第一个儿子
son.SetAsFirstSibling();
//把自己设置成最后一个儿子
son.SetAsLastSibling();
//把自己设置成任意儿子
son.SetSiblingIndex(5);//如果超了就会默认为最后一个

坐标转换

世界坐标系转本地坐标系

1
2
3
4
5
6
7
8
//世界坐标系点转换为本地坐标系点
//受到缩放的影响
this.transform.InverseTransformPoint(Vector3.forward);
//世界坐标系的方向转换为本地坐标系方向
//不受缩放影响
this.transform.InverseTransformDirection(Vector3.forward);
//受缩放影响
this.transform.InverseTransformVector(Vector3.forward);

本地坐标系转世界坐标系

1
2
3
4
5
6
7
8
//本地点转世界点
//受缩放影响
this.transform.TransformPoint(Vector3.forward);
//本地坐标系方向转换为世界坐标系方向
//不受缩放影响
this.transform.TransformDirection(Vector3.forward);
//受缩放影响
this.transform.TransformVector(Vector3.forward);

Input

输入相关内容是写在update函数中的

鼠标和键盘输入

检测鼠标输入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//检测鼠标在屏幕上的位置
//屏幕坐标的原点是在屏幕左下角,往右是x轴正方向,往上是y轴正方向
Input.mousePosition;
//检测鼠标输入
//鼠标按下的一瞬间进入的函数
//0表示左键,1表示右键,2表示中键
//只有按下的这一次进入
if(Input.GetMouseButtonDown(0))
{

}
//鼠标抬起的一瞬间进入的
//0,1,2代表一样
if(Input.GetMouseButtonUp(0))
{

}
//鼠标长按按下抬起都会进入
if(Input.GetMouseButton(0))
{

}
//中键滚动
//返回值y -1下 0 1上
Input.mouseScrollDelta

检测键盘输入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//键盘按下
if(Input.GetKeyDown(keyCode.W))
{

}
//传入字符串重载
//这里传入的字符串不能是大写的
if(Inpute.GetKeyDown("w"))
{

}
//键盘抬起
if(Input.GetKeyUp(keyCode.W))
{

}
//键盘长按
if(Input.GetKey(keyCode.W))
{

}

检测默认轴输入

1
2
3
4
5
6
7
8
9
10
//控制玩家,旋转和位移等
//键盘AD按下时,返回-1到1之间变换
Input.GetAxis("Horizontal");//括号里的内容可以设置,在Project Setting中可以设置Input Manager
//键盘WS按下时,返回-1到1之间的变换
Input.GetAxis("Vertical");
//鼠标横向移动时 -1到1左右
Input.GetAxis("Mouse X");
//鼠标上下移动时 -1到1上下
Input.GetAxis("Mouse Y");
//还有一个GetAxisRaw,跟GetAxis差不多,只是没有中间值,只有-1,0,1;

其他

1
2
3
4
5
6
7
8
9
10
11
12
//是否有任意键或鼠标长按
if(Input.anyKey)
{

}
//是否有任意键或鼠标按下
if(Input.anyKeyDown)
{

}
//这一帧的键盘输入
Input.inputString;

手柄输入相关

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//得到链接手柄的所有按钮名字
string[] strs = Input.GetJoystickNames();
//某一个手柄键按下
if(Input.GetButtonDown("xxx"))
{

}
//某一个手柄键抬起
if(Input.GetButtonUp("xxx"))
{

}
//某一个手柄按键长按
if(Input.GetButton("xxx"))
{

}

移动设备触摸相关

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if(Input.touchCount > 0)
{
Touch t1 = Input.touches[0];
//位置
t1.position;
//相对于上次的位置
t1.deltaPosition;
}
//是够启动多点触控
Input.multiTouchEnabled = false;
//陀螺仪
//是否开启
Input.gyro.enabled = true;
//重力加速度
Input.gyro.gravity;
//旋转速度
Input.gyro.rotationRate;
//陀螺仪当前旋转四元素。
Input.gyro.attitude;

屏幕相关Screen

静态属性

当前分辨率

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Resolution r = Screen.CurrentResolution;
print(r.width + " " + r.height);
//屏幕窗口当前宽高
Screen.Width;
Screen.Weight;
//屏幕休眠模式
Screen.sleepTimeout = SleepTimeout.NeverSleep;

//运行时是否全屏模式
Screen.fullScreen = true;
//窗口模式
//独占全屏
Screen.fullScreenMode = FullScreenMode.ExclusiveFullScreen;
//全屏窗口
Screen.fullScreenMode = FullScreenMode.FullScreenWindow;
//最大化窗口
Screen.fullScreenMode = FullScreenMode.MaximizedWindow;
//窗口模式
Screen.fullScreenMode = FullScreenMode.Windowed;

//移动设备屏幕旋转相关
//允许自动旋转为左横向,Home键在左
Screen.autorotateToLandscapeLeft = true;
//允许自动旋转为右横向,Home键在右
Screen.autorotateToLandscapeRight = true;
//允许自动旋转到纵向,Home键在下
Screen.autorotateToPortrait = true;
//允许自动旋转到纵向倒着看,Home键在上
Screen.autorotateToPortraitUpsideDown = true;
//制定屏幕显示方向
Screen.Orientation = ScreenOrientation.xxx;

静态方法

设置分辨率

1
2
//第三个参数是是否全屏
Screen.SetResolution(1920, 1080, false);

Camera

Camera组件信息

Clear Flags

如何清除背景

  • skybox天空盒
  • Solid Color颜色填充
  • Depth only 只画该图层,背景透明
  • Dont Clear 不移除,覆盖渲染

Culling Mask

选择性渲染部分层级——可以指定只渲染对应层级的对象

Projection

Perspective 透视模式

  • FOV Axis —— 现场角 轴 决定了光学仪器的视野范围
  • Field of view——视口大小
  • Physical Camera(摄影相关)…….
    orthography 正交摄像机(一般用于制作2D游戏)

Clipping Planes

裁剪平面距离

Viewport Rect

视口范围,屏幕上将绘制该摄像机试图的位置

  • 主要用于双摄像机游戏
  • 0~1相当于宽高比

Depth

渲染顺序上的深度

Redering path

渲染路径

Target Texture

渲染纹理

  • 可以把摄像机画面渲染到一张图上——主要用于制作小地图
  • 在Project右键创建一个Render Texture

Occlusion Culling

是否启用剔除遮挡

Allow HDR

是否允许高动态范围渲染

Allow MSAA

是否允许抗锯齿

Allow Dynamic Resolution

是否允许动态分辨率呈现

Target Display

用于哪个显示器——主要用来开发多个屏幕的平台游戏

Camera代码相关

重要的静态成员

获取摄像机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//主摄像机的获取
//标签一定要是MainCamera
Camera.main.name;
//获取摄像机的数量
Camera.allCameraCount;
//得到所有摄像机
Camera[] cas = Camera.allCamera;
//渲染委托
//摄像机剔除处理的委托函数
Camera.onPreCull += (c) =>
{

};
//计算机渲染前处理的委托
Camera.onPreRender += (c) =>
{

};
//摄像机渲染后处理的委托
Camera.onPostRender += (c) =>
{

};

重要成员

1
2
3
4
5
6
7
8
9
//界面上的参数都可以在Camera中得到
Camera.main.depth = 10;
//世界坐标转屏幕坐标
Vector3 v = Camera.main.WorldToScreenPoint(this.transform.position);
//屏幕坐标转世界坐标
//之所以改变z轴是因为不改的话就一直是0,这样就始终是摄像机原点
Vector3 x = Input.mousePosition;
x.z = 10;
Vector3 v = Camera.main.ScreenToWorldPoint(x);