Unity 琐碎知识汇总 持续更新ing

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需要注意:

  1. 想查询UnityEngine api 搜索unity的文档:
    https://docs.unity3d.com/ScriptReference/
  2. 想查询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代码断点

  1. 在Unity的MonoDevelop中代码对应行添加断点,断点在行的最左边框点击即可
  2. 点击MonoDevelop的play按钮,或者按cmd+enter,如果代码有错误这里是无法跑起来的,必须先清理代码错误
  3. 点击Unity中的play按钮
  4. 操作到代码执行行时程序会停在断点处

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; //默认图层
Unity 琐碎知识汇总 持续更新ing_第1张图片
image.png

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

你可能感兴趣的:(Unity 琐碎知识汇总 持续更新ing)