一、Resources (资源)
Resources类允许你按照它们的路径名查找并加载物体。在编辑器中,Resources.FindObjectsOfTypeAll可用于查找assets和Scene对象。所有位于Assets文件夹下名为"Resources"的文件夹中的资源,都可以Resources.Load 函数访问。可能存在多个“资源”文件夹,并且在加载对象时将检查每个文件夹。
在Unity中通常不需要使用路径名来访问资源,相反你可以通过声明一个成员变量来暴露一个资源的引用,然后在检视面板中指定它。使用这个技巧的时候Unity可以在构建的时候自动计算哪个资源被使用。这从根本上最大限度地减少了实际用于游戏的资源的尺寸。当你放资源在"Resources"文件夹中时这个不会这么做,因此所有在"Resources"文件夹中的资源都将被包含在游戏中。
另一个使用路径名的缺点是,缺乏可重用性,因为脚本对于使用的资源具有硬编码要求。另一方面使用暴露在检视面板中的资源引用,是自文档化的,对于使用脚本的用户来说也是立竿见影的。
然而,有些情况下按照名称而不是在检视面板中取回一个资源是更方便的,尤其是当在检视面板中指定引用是不方便的时候。例如你或许想从脚本创建一个游戏物体,为程序生成的网格赋值一个纹理。
即使场景中不存在任何实例,某些已加载的资源(尤其是纹理)也会耗尽内存。要在不再需要Assets时回收此内存,可以使用Resources.UnloadUnusedAssets。
注:需要在使用前要在Assets文件夹创建该Resources 。创建新项目时不会创建它。
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour
{
void Start()
{
GameObject go = GameObject.CreatePrimitive(PrimitiveType.Plane);
Renderer rend = go.GetComponent<Renderer>();
rend.material.mainTexture = Resources.Load("glass") as Texture;
}
}
Static Methods
FindObjectsOfTypeAll | 返回Type类型的所有物体的一个列表。 |
Load | 加载储存在Resources文件夹中path处的资源。 |
LoadAll | 加载Resources文件夹中的path文件夹或者文件中的所有资源。 |
LoadAsync | 异步加载资源文件夹中路径中存储的Assets。 |
UnloadAsset | 从内存中卸载Assets。 |
UnloadUnusedAssets | 卸载未使用的Assets。 |
二、Transform
Transform类继承自Commonent类,并实现了IEnumberable接口。Transform是GameObject必须拥有的一个组件,用来管理所在GameObject对象的坐标位置、旋转角度和大小缩放。由于Transform实现了IEnumberable接口,于是可以在程序中使用foreach()方法快速遍历子物体的Transform结构。我们知道,在程序执行时,foreach()方法要比for()方法快,所以在无需记录遍历位置的情况下尽量使用foreach(),如以下代码:
using UnityEngine;
//将所有子物体放大2*2*2=8倍,不包括自身
public class Test1 : MonoBehaviour
{
void Start()
{
foreach (Transform child in transform) {
child.localScale *= 2.0f;
}
}
}
1. Transform类实例属性
在Transform类中,涉及的实例属性有eulerAngles、forWard、hasChanged、localPosition、localToWorldMatrix、parent和worldToLocalMatrix属性。
1.1 eulerAngles属性:欧拉角
基本语法: public Vector3 eulerAngles{ get; set; }
功能说明:此属性用于返回或设置GameObject对象的欧拉角,对其使用说明如下。
(1)在Unity3D引擎中使用四元数Quaternion来存储和表示GameObjec的旋转角度,无论是在Inspector面板中对Rotation设置了怎样的数值,还是在脚本中对transform.eulerAngles赋予了怎样的数值,程序在编译运行时都会把它们转换成Quaternion类型再计算。
(2)只能对transform. eulerAngles进行整体赋值,如transform. eulerAngles=new Vector(1.0f,2.0f,3.0f),不可以对transform. eulerAngles的单独分量(如transform.eulerAngles.x)进行赋值。
(3)transform. eulerAngles.x返回值的范围为[0,90]和[270,360);transform. eulerAngles.y和transform. eulerAngles .z返回值的范围为[0 ,360)。
(4)对transform. eulerAngles进行赋值或获取transform. eulerAngles的值都是相对世界坐标系而言的,若要相对transform的父物体(如果有的话)进行角度的变换则需要使用属性localEulerAngles来设置。
(5)设在脚本中有代码: transform. eulerAngles=new Vector3(10.0f, 20.0f,30.0f),则Game0bject对象会先沿着z轴旋转30度,再沿着x轴旋转10度,最后再沿着y轴旋转20度。注意不同的旋转执行顺序,物体的最终状态是不同的。
1.2 forward属性: z轴单位向量
基本语法:public Vector3 forward { get; set; }
功能说明:此属性用于返回或设置transform自身坐标系中z轴方向的单位向量对应的世界坐标系中的单位向量。transform. forward即为transform. TransformDirection(new Vector3(0.0f, 0.0f, 1.0f))的简化方式。
例子(Transform的right、up和forward属 性的使用。):
using UnityEngine;
using System.Collections;
public class Tset1 : MonoBehaviour {
void Start()
{
//先给transform一个任意的欧拉角,使得transform的局部坐标系和世界坐标系方向不一致
transform.eulerAngles = new Vector3(15.0f, 30.0f, 60.0f);
//right
Debug.Log(" right:" + transform.right);
Debug.Log("Dir:" + transform.TransformDirection(new Vector3(1.0f, 0.0f, 0.0f)));
//up
Debug.Log("up:" + transform.up);
Debug.Log("Dir:" + transform.TransformDirection(new Vector3(0.0f, 1.0f, 0.0f)));
//forward
Debug.Log(" forward:" + transform.forward);
Debug.Log("Dir:" + transform.TransformDirection(new Vector3(0.0f, 0.0f, 1.0f)));
}
}
在这段代码的Start方法中,首先给transform一个任意的欧拉角,使得transform的局部坐标系和世界坐标系方向不-致,然后分别打印出transform的right、up和forward值,并调用TransformDirection方法实现相同的功能,结果如图12-1所示。
ps:如果代码出现了一下这个错误多半是你复制我的代码跟你的vs版本冲突等问题,这时候你就要在自己vs新建一个脚本,把关键代码复制过去即可,不要全部复制。