Unity的一些基础总结
这几天重新拾起了自己草草学习的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为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);
}
}
6. 细碎的总结
- trigger是在collider碰撞箱中,该触发物体无需物理引擎,因为无论怎样都会被穿透。
- 音乐组件为audiosource。
- 如果物体具有物理引擎,那么也应该有碰撞盒子。
- 状态机的速度可以通过点击对应绑定对象的animator的状态进行设置。
- 动画可能会产生一些事件,使用 animator.fireEvents = false; 可以取消所有的动画返回事件。
- 如果想要知道动画是否播放或者处于什么阶段,点击已经绑定的状态机,有一个addbehaviour按钮,点击就可以创建该动画的行为脚本,该脚本函数参数Animator即为绑定对象上的组件,通过 animator.gameObject 可以获取该动画所发生的对象,从而对该对象的其它内容进行管理,比如音效控制等,对于一些需要动作结束结算的也可以在这里进行处理。
- 人物材质要随模型一起导入进来,对于pmx格式的mmd文件,需要转化格式fbx,对于blender的版本不能太高,大概2.8多即可,否则会修复失败!!!
好啦,今天就先总结这么多,后面有时间会对unity的向量使用进行一个详细的总结,主要的是相机跟随、人物控制、敌人追寻角色等和向量、角度密切相关的功能以及算法。还有秋招陆续要开始了,一定要挤进去啊啊啊!!
相关文章
- Java编程中忽略这些细节,Bug肯定找上你
- 9个问题,带你掌握流程控制语句中的java原理
- 从IDC Marketscape报告看区块链政务数字化未来:权威解读新热点、新机遇
- chatGPT的火爆,并不偶然
- React 开发 | 常用 Hooks
- JDK19都出来了~是时候梳理清楚JDK的各个版本的特性了【JDK12特性讲解】
- Eolink 让我“重新认识“了自动化测试...
- 老板:你也把咱们网站弄成灰色——网站变灰色如何实现
- iptables规则案例
- ‘极锐’-一种新的锐化算法
- PS/LR滤镜插件套装 Nik Collection v5.3.0 Win/Mac
- Chrome插件:uBlock Origin – Chrome浏览器高效低占用的广告拦截插件
- 前端与区块链
- 云原生之微服务
- 集群动态环境管理神器 Modules
- 记 os_object_release Crash 排查
- 记 libAccessibility 通知 Crash 排查
- Ant Design Pro 中 点击子菜单的时候,其他菜单不自动收起来
- ETC 可视化
- 1267-Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLIC for o...