1.绑定一个类与一个资源的联系:
把资源图片拖拽到场景中,并选中,然后在属性(Inspector),添加组建,选择类,找到库中的对应类,这时候把此封装好的对象拖拽到资源中,就成了绑定后到对象了(对象本身是资源,包含了对应的类,以及适配场景的相关参数)
复制资源也是通过这种方式,通过从库中找到对应的对象,通过代码来复制到场景中。
2.通过代码创建对象实例
GameObject obj = Instantiate(Resources.Load("对象在库中的名字和在Resource目录下的相对路径",typeof(GameObject))) as GameObject;
//比如"obj/ball"
3.通过代码绑定代码到对象实例
GameObject obj = Instantiate(Resources.Load("对象名",typeof(GameObject))) as GameObject;
CustomClass objCls = obj.AddComponent() as CustomClass;
4.父子关系连接
//父子链接方式,不像其他引擎一样addChild这样使用
obj.transform.parent = transform;
5.设置位置和父子关系
//顺序1
obj.transform.parent = transform;
obj.transform.localPosition=new Vector3(0,0,0);
//顺序2
obj.transform.localPosition=new Vector3(0,0,0);
obj.transform.parent = transform;
位置会在父子关系变化后进行相对计算,当obj在场景时(1,1)时,再移动到某非零坐标父级时,obj的相对父级坐标会发生变化,而不会改变当前位置,也就是当parent对象改变时,obj的绝对场景坐标并不发生变化。
6.如何创建单例
static private ZSTouchEventCore _single = null;
static private bool _isEnableRecreate = true;
static public ZSTouchEventCore Single(){
if (_single == null && _isEnableRecreate) {
GameObject gameObj = new GameObject ();
gameObj.name = "ZSTouchEventCore";
_single = gameObj.AddComponent (); //Instantiate (ZSTouchEventCore) as ZSTouchEventCore;
}
return _single;
}
//调用方法:
//ZSTouchEventCore.Single();
7.世界坐标系 <===> 局部坐标系
//世界坐标系->局部坐标系
transform.InverseTransformPoint(pot);
//局部坐标系->世界坐标系
transform.TransformPoint(pot)
8.UnityEngine 和 System
using UnityEngine;
using System;
这两个类总是伴随着歧义,而同名类实现响应又不同,查询这些api需要注意:
- 想查询UnityEngine api 搜索unity的文档:
https://docs.unity3d.com/ScriptReference/ - 想查询System api 搜索c#的文档
9.创建二维数组
List> poolA = new List> () {
new List(){ new CLASS()}
};
10.如何复制数组
将一个数组复制给另一个变量
List> poolB = new List> ();
poolB.AddRange (poolA);
11.混淆的 Awake 和 Start
所有基于 MonoBehaviour 类的对象,都有的几种函数响应
Awake -->OnEable--> Start --> FixedUpdate --> Update --> LateUpdate -->OnGUI -->Reset --> OnDisable -->OnDestroy
-
Awake
:用于在游戏开始之前初始化变量或游戏状态。在脚本整个生命周期内它仅被调用一次 -
Start
:仅在Update函数第一次被调用前调用。Start在behaviour的生命周期中只被调用一次 -
FixedUpdate
:固定帧更新,在Unity导航菜单栏中,点击“Edit”-->“Project Setting”-->“Time”菜单项后,右侧的Inspector视图将弹出时间管理器,其中“Fixed Timestep”选项用于设置FixedUpdate()的更新频率,更新频率默认为0.02s -
Update
:正常帧更新,用于更新逻辑。每一帧都执行,处理Rigidbody时,需要用FixedUpdate代替Update。例如:给刚体加一个作用力时,你必须应用作用力在FixedUpdate里的固定帧,而不是Update中的帧。 -
LateUpdate
:在所有Update函数调用后被调用,和fixedupdate一样都是每一帧都被调用执行,这可用于调整脚本执行顺序。例如:当物体在Update里移动时,跟随物体的相机可以在LateUpdate里实现。 -
OnGUI
:在渲染和处理GUI事件时调用。比如:你画一个button或label时常常用到它。这意味着OnGUI也是每帧执行一次。 -
Reset
:在用户点击检视面板的Reset按钮或者首次添加该组件时被调用。此函数只在编辑模式下被调用。 -
OnDisable
:当物体被销毁时 OnDisable将被调用,并且可用于任意清理代码。脚本被卸载时,OnDisable将被调用,OnEnable在脚本被载入后调用。注意: OnDisable不能用于协同程序。 -
OnDestroy
:当MonoBehaviour将被销毁时,这个函数被调用。OnDestroy只会在预先已经被激活的游戏物体上被调用。注意:OnDestroy也不能用于协同程序。
引用:https://www.jianshu.com/p/68ecef805135
12.协同程序
即在主程序运行时同时开启另一段逻辑处理,来协同当前程序的执行。换句话说,开启协同程序就是开启另外一个线程。使用MonoBehaviour.StartCoroutine方法即可开启一个协同程序,也就是说该方法必须在MonoBehaviour或继承于MonoBehaviour的类中调用。
引用:https://www.jianshu.com/p/68ecef805135
13.如何测试Unity代码断点
- 在Unity的MonoDevelop中代码对应行添加断点,断点在行的最左边框点击即可
- 点击MonoDevelop的play按钮,或者按cmd+enter,如果代码有错误这里是无法跑起来的,必须先清理代码错误
- 点击Unity中的play按钮
- 操作到代码执行行时程序会停在断点处
14.获得 GameObject 的 SpriteRenderer
SpriteRenderer renderer = null;
if (GetComponent ()) {
renderer = GetComponent ();
} else {
renderer = gameObject.AddComponent ();
}
15. 更新 SpriteRenderer 图片资源
GameObject gameobj = (Resources.Load (GConf.Single().poolMiniName[3], typeof(GameObject)) as GameObject);
renderer.sprite = gameobj.GetComponent ().sprite;
16. 扩展 getter 和 setter
private int age;
public int Age{
get { return age; }
set { age = value; }
}
17.用 GameObject.Find 找不到对象
GameObject.Find 只能搜到全局对象中显示出来的,而如果默认是隐藏,是无法找到的
可以使用 transform.find找隐藏的对象,但是transform.find只能搜同一个节点下
18.发布到 ios xcode 时使用模拟器测试
Edit ->ProjectSettings ->PlayerSettimg ->属性面板
属性面板里面找iphone手机,展开Other Settings,选择Target SDK,Simulator SDK对应模拟器,Device SDK对应真机
还是很墨迹到
19.场景跳转
SceneManager.LoadScene("sceneName");
20. 设置图层
在Inspector属性面板下可以设置图层id对应的图层名。
但如果想要把一个动态创建对象设置为某个图层则要看图层编号了。
gameObject.layer = 0; //默认图层
21.创建空的GameObject
并不是必须每次都要在scene中手动创建节点的,空GameObject可以直接new出来
GameObject groupObj = new GameObject("group");
只有 GameObject 创建后会自动添加到 scene 中,而如果要new一个新的class,则并不会,如果想要动态添加class文件给 GameObject ,那么应该这样写
GameObject groupObj = new GameObject("group");
CLASS groupCls = groupObj.AddComponent ();
22.找到子对象
Transform t = transform.Find("childName");
23.隐藏和销毁对象
隐藏
gameObj.SetActive(false);
销毁
Destroy(gameObj);
24.更换sprite图片
gameObject.GetComponent().sprite = Resources.Load("xxx.png", typeof(Sprite)) as Sprite;
25.获得第一个触摸点在游戏世界中的坐标
Camera.main.ScreenToWorldPoint (Input.GetTouch (0).position);
26.缩放适应指定长度
1.获得对象的长度
var width = gameObject.GetComponent ().sprite.bounds.size.x;
2.设置需要的长度
var widthTarget = 10;
3.设置对象缩放大小
var s = gameObject.transform.localScale;
s.y = widthTarget/width;
gameObject.transform.localScale = s;
注意将对象的sprite缩放设置为单向缩放,资源中选择属性中的pivot对应相应的值。
26.场景大小
Screen.width / Screen.height