Unity3D

304 阅读3分钟

入门

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等数字内容生产工具

  1. ProBuilder、ProGrid、PolyBrush等建模工具
  2. Timeline
  3. Cinemachine
  4. HD Post Processing Effect(HDRP后期特效模块)
  5. Shader Graph
  6. Visual Effect Graph
  7. Unity Recorder

HDRP高清渲染管线VR开发实践

本次直播将会通过以下内容向大家介绍HDRP在VR开发中的具体应用:

1. HDRP基础简介(帮助还不怎么了解HDRP的朋友入门):

  • HDRP配置文件和Volume架构
  • HDRP灯光
  • HDRP材质
  • HDRP后处理

2. HDRP VR开发实例:

  • 项目介绍
  • 使用XR Interactive Toolkit
  • VR项目硬件中实际演示

Q 面试题

  • 使用单件模式的动机是什么?
  • 如何使用单件对象?
  • 二选一:
    1. 顺序表:
      • 一个顺序表类至少需要哪几个数据成员?
      • 顺序表的优缺点是什么?
    2. 动态数组:
      • 动态数组的优缺点 (随机访问速度快)
      • 什么是装箱、拆箱?何时需要?何种类型的变量需要? (值类型的变量需要,放到数组里需要装箱)

Q 插件

Q 数字人

Q readyPlayer.me

Q GLB

-

Q 系统

  • Windows
  • Linux
  • Unix

Q GCC

编译工具套件

  • CMake

工具链

Q 模型转换

Q 3dmax 转 SW

Q

3ds

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 右下角 +
  • 脚本
  • 按钮对象

截屏2022-07-07 下午5.52.42.png

Q 异步场景切换

public static AsyncOperation LoadSceneAsync (string sceneName, LoadSceneParameters parameters);

Q Unity3D证书

  • 研发证书
  • 美术设计证书

致谢