Unity的一些基础总结

前往原站点查看

2022-07-05 00:26:28

    这几天重新拾起了自己草草学习的unity技术(不到一周),开始了大胆的模仿原神之路。下面做一些总结。

1. 添加天空材质

    首先作为一个世界肯定要有一个天空的材质啦,从unity社区找了一个带地形和天空材质的包。如下设置天空背景环境。地形则是直接从资源包中导入了demo地形(种了很多多树的草原)。

2. 添加UI的字体

    对于新版的unity,将原本的text升级为textMeshPro(听说是收购的),但是发现字体的设置不能直接拖入ttf文件,而是一个fontasset方式,我们需要右键ttf字体文件,选择 create>textmeshpro>fontasset 来创建该字体资源,之后即会生成对应需要的fontasset文件,注意,原来的ttf文件不要删掉,否则对于动态产生的文字,如果有没有出现过的,那么将会字体装载失败(确实对应的字体成为默认字体)。

3. UI的显示与隐藏

对于隐藏的物品,无法通过GameObject.Find来找到,但是可以通过其父级使用find来找到,所以对于可能会隐藏的ui一定要有一个父级且该父级永远不会消失。

GameObject.Find("ui").transform.Find("menu").gameObject.SetActive(true);

ui的隐藏设置: gameObject.SetActive(false);

4. 时间暂停与鼠标锁定、按钮事件挂载、动画播放状态切换

使用 Time.timeScale = 0; 可以将时间暂停,恢复则设置成1.

使用 Cursor.lockState = CursorLockMode.Locked; 可以设置鼠标指针锁定(即不显示).

对于menu上的按钮等,可以将click的响应函数放在menu上进行统一管理。

动画播放则只要找到该物件上的animator,之后通过animator对象的set方法设置触发即可。

5. 3d物品展示在ui层

有时候我们需要把一个在世界的3d物品展示在ui上,那么可以采用如下方法:

i 先将该物品的layer设置成thing(或者其它的,该layer标识的所有东西都会被第二相机捕捉到)

ii ui层添加raw image原始图片

iii 添加第二相机,该相机先将audio listener关闭,设置clearflags为solidcolorcullingmask设置为thing(只捕捉layer为thing的物品),将far和near设置成刚好可以拍到该物体的值,最后右键assets创建一个rendertexture加入到相机中。

iv 将该rendertexture同样拖到rawimage的材质中,这样相机拍到的thinglayer图片会渲染到rendertexture上,再由rawimage展示出来

v 当然这样只是理论上的成功,实际上我们还要改变第二相机的位置从而实现物体被展示。我这边采用的逻辑是,一个物体,当被触发时,将相机移到该被触发的物体这,视角转向该物体进行捕捉,当离开触发区域,重新渲染并且撤走。代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class plant_trigger : MonoBehaviour
{
    private GameObject thingCamera;

    void Start()
    {
        thingCamera = GameObject.Find("thing_catch").gameObject;
    }

    void Update() { }

    private void OnTriggerEnter(Collider other)
    {
        Transform posi = thingCamera.transform;
        posi.position = transform.position + Vector3.back;

        Vector3 dir = transform.position - posi.position;
        posi.rotation = Quaternion.LookRotation(dir, Vector3.up);

        GameObject thingBox = GameObject.Find("info").transform.Find("thing_box").gameObject;
        thingBox.SetActive(true);
    }

    private void OnTriggerStay(Collider other)
    {
        if (Input.GetKeyUp(KeyCode.F))
        {
            gameObject.SetActive(false);
            OnTriggerExit(other);
        }
    }

    private void OnTriggerExit(Collider other)
    {
        thingCamera.transform.position = new Vector3(-1, -1, -1);
        Camera camera = thingCamera.GetComponent<Camera>();
        camera.Render();

        GameObject thingBox = GameObject.Find("info").transform.Find("thing_box").gameObject;
        thingBox.SetActive(false);
    }
}

6. 细碎的总结


   好啦,今天就先总结这么多,后面有时间会对unity的向量使用进行一个详细的总结,主要的是相机跟随、人物控制、敌人追寻角色等和向量、角度密切相关的功能以及算法。还有秋招陆续要开始了,一定要挤进去啊啊啊!!


上一篇:yum报错NoMirrorList
下一篇:font-spider压缩字体文件