Unity之脚本API笔记一(Resources详解及使用方法,一点关于transform)

一、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新建一个脚本,把关键代码复制过去即可,不要全部复制。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值