2022-07-05 00:26:28
这几天重新拾起了自己草草学习的unity技术(不到一周),开始了大胆的模仿原神之路。下面做一些总结。
首先作为一个世界肯定要有一个天空的材质啦,从unity社区找了一个带地形和天空材质的包。如下设置天空背景环境。地形则是直接从资源包中导入了demo地形(种了很多多树的草原)。
对于新版的unity,将原本的text升级为textMeshPro(听说是收购的),但是发现字体的设置不能直接拖入ttf文件,而是一个fontasset方式,我们需要右键ttf字体文件,选择 create>textmeshpro>fontasset 来创建该字体资源,之后即会生成对应需要的fontasset文件,注意,原来的ttf文件不要删掉,否则对于动态产生的文字,如果有没有出现过的,那么将会字体装载失败(确实对应的字体成为默认字体)。
对于隐藏的物品,无法通过GameObject.Find来找到,但是可以通过其父级使用find来找到,所以对于可能会隐藏的ui一定要有一个父级且该父级永远不会消失。
GameObject.Find("ui").transform.Find("menu").gameObject.SetActive(true);
ui的隐藏设置: gameObject.SetActive(false);
使用 Time.timeScale = 0; 可以将时间暂停,恢复则设置成1.
使用 Cursor.lockState = CursorLockMode.Locked; 可以设置鼠标指针锁定(即不显示).
对于menu上的按钮等,可以将click的响应函数放在menu上进行统一管理。
动画播放则只要找到该物件上的animator,之后通过animator对象的set方法设置触发即可。
有时候我们需要把一个在世界的3d物品展示在ui上,那么可以采用如下方法:
i 先将该物品的layer设置成thing(或者其它的,该layer标识的所有东西都会被第二相机捕捉到)
ii ui层添加raw image原始图片
iii 添加第二相机,该相机先将audio listener关闭,设置clearflags为solidcolor,cullingmask设置为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);
}
}
好啦,今天就先总结这么多,后面有时间会对unity的向量使用进行一个详细的总结,主要的是相机跟随、人物控制、敌人追寻角色等和向量、角度密切相关的功能以及算法。还有秋招陆续要开始了,一定要挤进去啊啊啊!!