Unity萌新日记—开发小技巧与冷知识(脚本篇)

 

在学习unity的过程中,总会遇到很多零碎的知识点和小技巧,在此把它们记录下来,方便日后查看。
第一篇是关于脚本的一些你可能不知道的小知识。
还是个正在学习的萌新,如果写的不好,请谅解。
Unity版本:2018.3.2f1。

1.使用RuntimeInitializeOnLoadMethod特性的静态方法会在场景加载后直接调用(这个脚本不需要挂载到物体上)

   [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)]
    public static void Test()
    {
        Debug.Log("start game");
    }

2.使用SerializeField将私有变量暴露在检视面板中,使用HideInInspector特性在检视面板中隐藏公有变量

在这里插入图片描述

3.用以下代码获得一个随机的布尔值

bool x= (Random.value > 0.5f);

4.以下代码可以在第一个协程结束时启动第二个协程

    IEnumerator First()
    {
        yield return StartCoroutine(Second());
    }

    IEnumerator Second()
    {
        yield return 0;
    }

5.以下代码可以让编辑器暂停,方便调试

EditorApplication.isPaused = true;

6.使用CompareTag来比较标签而不是obj.Tag==“player”,效率更高

        GameObject obj;
        if (obj.CompareTag("player"))
        {
            Debug.Log("Is Player");
        }

7.Debug支持一些简单样式

Debug.Log("<color=red>Oh!!!</color>");

在这里插入图片描述

8.怎么忽略控制台警告

在这里插入图片描述
先查看警告中的代号,就是CS之后的数字,这里是0414,再到脚本中最上方加上以下代码

#pragma warning disable 0414

回到Unity编译,就不会再弹出警告了

9.不要频繁使用Camera.main,它其实就是…

Camera.main = GameObject.FindGameObjectWithTag("MainCamera").GetComponent<Camera>();

10.比较距离时不要用Vector3.distance

Vector3.sqrMagnitude用于得到向量长度未开方的值,使用(a - b).sqrMagnitude和距离平方作比较,这样不用做开方运算,效率更高

    Vector3 a;
    Vector3 b;
    float distance = 1f;
    void Update()
    {
        if ((a - b).sqrMagnitude < distance * distance)
        {
            //todo
        }
    }

11.给检视面板添加一些效果

    [Header("等级")]     //给变量加上标题文字
    public int level;
    [Space]                  //空行
    [TextArea]              //多行输入框
    public string Des;
    [Range(0,10)]          //滑动条
    public float Speed=1;
    [Tooltip("生命值")]  //鼠标移到变量上出现的提示
    public int Hp = 100;

在这里插入图片描述

12.如果只是存储几个数据,建议使用结构体而不是类,以减少垃圾回收

struct Data
{
    int level;
    int hp;
    int gold;
}

13.字符串拼接会造成大量垃圾回收,建议使用StringBuilder

        int i = 1;
        //字符串拼接,不建议
        string s = "aaa" + i + "bbb" + "ccc";
        //StringBuilder
        StringBuilder sb = new StringBuilder();
        sb.Append("aaa");
        sb.Append(i);
        sb.Append("bbb");
        sb.Append("ccc");

14.让游戏物体延迟一段时间后销毁

只需给Destroy函数多传入一个参数即可

Destroy(gameObject, 2f);   //延迟2秒后销毁

15.想要平滑地移动刚体应当使用MovePosition方法,想要传送刚体应设置Rigidbody.Position

官方文档原话,总之有刚体就不要用Transform去移动
在这里插入图片描述

16.得到一定范围内所有物体(需要有碰撞体)

Vector3 A = Vector3.zero;
Collider[] colliders=Physics.OverlapSphere(Vector3.zero, 5f);     
//得到以A点为中心半径为5的圆内所有带碰撞体的物体

17.使用LookRotation朝向目标点

    public Transform target;
    void Start()
    {
        transform.rotation = Quaternion.LookRotation(target.position - transform.position);
    }

18.自动添加依赖组件

[RequireComponent(typeof(Rigidbody))] 

在类前面添加RequireComponent特性,当你将这个脚本挂载到游戏物体上时,如果游戏物体没有所需的依赖组件(此处是刚体组件),会自动添加一个(注意已经挂载该脚本的游戏物体不受影响)

19.通过代码设置Hierarchy层级

使用SetSiblingIndex设置物体在Hierarchy面板的位置

    void Start()
    {
        transform.SetSiblingIndex(0);
    }

运行前在这里插入图片描述
运行后在这里插入图片描述

20.遍历所有子物体(只能获取到下一级)

        foreach(Transform t in transform)
        {
            print(t.name);
        }

第一篇暂时先写这么多,写博客还是挺累的啊…越发佩服大佬们,以后再更新其他小技巧。

转载于:https://www.cnblogs.com/LiveForGame/p/10527619.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值