入门
1. 什么是HDRP
HDRP(High Definition Render Pipeline) 高清渲染管线,这里就要搞清楚一件事情,什么是管线(Pipeline)
管线简单来说就是处理流程,渲染管线就是Unity内部处理渲染的流程。
在早期Unity内部是有默认的标准渲染管线的,但是随着游戏技术的发展,标准渲染管线无法满足开发者日益增长的拓展要求,所以在Unity2018版本之后,unity在原有的标准渲染管线上增加了可编程渲染管线(Scriptable Render Pipeline,SRP),但是SRP的使用门槛相对来说又是比较高的,所以Unity又为SRP提供了两套模板,HDRP和URP(Universal Render Pipeline),HDRP主要针对的是高品质要求的平台,PC,XBOX,PS等,URP则可以使用在所有的平台上,一般使用在移动游戏开发上,目前HDRP对移动端高品质游戏的支持也正在研发之中
2. Unity内置的DCC工具
DCC(Digital Content Creation)工具,比如Maya、3ds Max等数字内容生产工具
- ProBuilder、ProGrid、PolyBrush等建模工具
- Timeline
- Cinemachine
- HD Post Processing Effect(HDRP后期特效模块)
- Shader Graph
- Visual Effect Graph
- Unity Recorder
本次直播将会通过以下内容向大家介绍HDRP在VR开发中的具体应用:
1. HDRP基础简介(帮助还不怎么了解HDRP的朋友入门):
- HDRP配置文件和Volume架构
- HDRP灯光
- HDRP材质
- HDRP后处理
2. HDRP VR开发实例:
- 项目介绍
- 使用XR Interactive Toolkit
- VR项目硬件中实际演示
Q 面试题
- 使用单件模式的动机是什么?
- 如何使用单件对象?
- 二选一:
- 顺序表:
- 一个顺序表类至少需要哪几个数据成员?
- 顺序表的优缺点是什么?
- 动态数组:
- 动态数组的优缺点 (随机访问速度快)
- 什么是装箱、拆箱?何时需要?何种类型的变量需要? (值类型的变量需要,放到数组里需要装箱)
- 顺序表:
Q 插件
Q 数字人
Q readyPlayer.me
Q GLB
Q 系统
- Windows
- Linux
- Unix
Q GCC
编译工具套件
- CMake
工具链
Q 模型转换
Q 3dmax 转 SW
Q
Q 单位转换
-单位转换
进阶
Q Unity Learn
- VR Developerment
Q DOTween
// Move a transform to position 1,2,3 in 1 second
transform.DOMove(new Vector3(1,2,3), 1);
// Scale the Y of a transform to 3 in 1 second
transform.DOScaleY(3, 1);
// Pause a transform's tween
transform.DOPause();
- 兼顾速度和效率
- 智能感知和类型安全
- 方便快捷
实战
Q 内置材质球
- Default-Diffuse
- Default-Material
- Default-Particle
- Default-Skybox
- Sprites-Default
// 下面的脚本在资源导入时自动替换内置资源,避免依赖内置图片、shader、材质球等
using UnityEngine;
using UnityEditor;
using System.Collections.Generic;
using System.Text.RegularExpressions;
class BuiltinAssetReplacePostprocessor : AssetPostprocessor
{
static Regex regex = new Regex("(Default-Material)|(Default-Diffuse)|(Default-Particle)|(Default-Skybox)|(Sprites-Default)|(Default-ParticleSystem)");
static Dictionary<string, Material> materials = new Dictionary<string, Material>();
static Material GetMaterial(string path) { Material material;
if (materials.TryGetValue(path, out material)) return material;
material = AssetDatabase.LoadMainAssetAtPath(path) as Material;
if (material == null) material = new Material(Shader.Find("Mobile/Diffuse"));
materials.Add(path, material);
return material;
}
//替换模型的内置材质球,只有当模型使用了内置的材质球和shader时会替换
protected virtual Material OnAssignMaterialModel(Material previousMaterial, Renderer renderer)
{
if (previousMaterial.name == "" || previousMaterial.name.Contains("Default-Material") || previousMaterial.shader.name.StartsWith("Standard") || previousMaterial.name.Contains("-Default") || previousMaterial.name.Contains("No Name") || !(assetImporter as ModelImporter).importMaterials)
{
return GetMaterial("Assets/builtin/builtin_materials/Default-Material.mat");
}
return null;
}
//替换prefab中引用的内置资源
static void OnPostprocessAllAssets(string[] importedAsset, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths) { if (importedAsset.Length > 0) { for (int i = 0; i < importedAsset.Length; i++) { var path = importedAsset[i]; if (!path.EndsWith(".prefab")) continue; GameObject go = AssetDatabase.LoadAssetAtPath<GameObject>(path); if (go == null) continue; Renderer[] renderers = go.GetComponentsInChildren<Renderer>(); if (renderers == null) continue; bool success = false; foreach (Renderer p in renderers) { if (p.sharedMaterials == null || p.sharedMaterials.Length <= 0) continue; Material[] materials = p.sharedMaterials; for (int j = 0; j < materials.Length; j++) { var material = materials[i]; if (material == null || Regex.IsMatch(AssetDatabase.GetAssetPath(material), @"Assets/builtin/builtin_materials/")) continue; var match = regex.Match(material.name); if (!match.Success) continue; Material newMaterial = GetMaterial(string.Format("Assets/builtin/builtin_materials/{0}.mat", material.name)); if (newMaterial == null) continue; materials[i] = newMaterial; success = true; } if (success) p.sharedMaterials = materials; } if (success) Debug.LogFormat("Replace default material of particle: \"{0}\" ", importedAsset[i]); } return; } } }
Q 2018.3文档
Q Unity 中文网
Q 组件
// 关闭组件
skills.transform.GetComponent<Rigidbody>().enabled = false;
//禁用与变灰
skills[3].GetComponent<Rigidbody>().interactable = false;
// 动态给对象添加刚体组件
obj.AddComponent<Rigidbody>();
//通过 GetComponent方法获取组件
obj.GetComponent<Rigidbody>().useGravity = false;
// 销毁对象绑定的组件或脚本
Destroy(obj.GetComponent<Rigidbody>());
Q UIElements Debugger
Q Button
- 绑定 onClick()
- List is Empty 右下角 +
- 脚本
- 按钮对象
Q 异步场景切换
public static AsyncOperation LoadSceneAsync (string sceneName, LoadSceneParameters parameters);
Q Unity3D证书
- 研发证书
- 美术设计证书