unity引擎基础
unity引擎基础
生命周期
Reset 是在用户点击检视面板的Reset按钮或者首次添加该组件时被调用。此函数只在编辑模式下被调用。Reset最常用于在检视面板中给定一个最常用的默认值。
Awake 用于在游戏开始之前初始化变量或游戏状态。在脚本整个生命周期内它仅被调用一次,当脚本设置为不可用时,运行时Awake方法仍然会执行一次。Awake在所有对象被初始化之后调用,所以你可以安全的与其他对象对话或用诸如 GameObject.FindWithTag 这样的函数搜索它们。每个游戏物体上的Awke以随机的顺序被调用。因此,你应该用Awake来设置脚本间的引用,并用Start来传递信息 ,Awake总是在Start之前被调用。它不能用来执行协同程序。
OnEnable当对象变为可用或激活状态时被调用事件监听。
Start 在behaviour的生命周期中只被调用一次。它和Awake的不同是Start只在脚本实例被启用时调用。你可以按需调整延迟初始化代码。Awake总是在Start之前执行。这允许你协调初始化顺序。
FixedUpdate 当MonoBehaviour启用时,其在每一帧 ...
Fungus 笔记
Fungus 文档地址首页 ·snozbot/fungus 维基 — Home · snozbot/fungus Wiki
简单入门:
【Unity 实用插件篇】 | 使用Fungus插件制作一个对话系统,简单好学易上手-腾讯云开发者社区-腾讯云
Fungus通信方式Fungus 是一个基于 Unity 的叙事工具,它提供了强大的可视化编程功能,但有时你需要将 Fungus 与自定义的 C# 代码结合使用,以实现更复杂的游戏逻辑。以下是 Fungus 与代码通信的几种常见方式:
1. 通过 Message 通信Fungus 的 Message 是一种事件机制,可以在代码中触发 Fungus 的 Block 执行。
步骤:
在 Fungus Flowchart 中创建一个 Block,并添加 Message 命令,设置 Message 名称(例如 "StartDialogue")。
在 C# 脚本中调用 Flowchart.SendMessage 来触发该 Message。
示例代码:12345678910111213141516using UnityEngine ...
Dialogue System for Unity
目前在使用Fungus,这个插件后续再使用
Dialogue System for Unity使用(一)基本设置和功能介绍-CSDN博客
764424567/Demo_DialogueSystem: DialogueSystem插件Demo
https://www.bilibili.com/video/BV13Y4y1Y7di
Dialogue System for Unity: Quick Start
【Unity3D插件】Dialogue System for Unity插件分享《对话系统插件》-CSDN博客
Unity红点系统
红点性能优化Unity基于前缀树的红点系统优化–从零到一手撕并且优化_unity 红点系统-CSDN博客
切割字符串网上很多红点系统利用的是字符串作为红点的键,这样在切割时会造成一定的GC
我们改成使用一个params来输入建,这样避免切割而且后续查找效率会更高
123456789101112131415161718192021222324252627282930313233343536373839private void Start(){ string st = "playlone|home|play|one|home"; // 测试params参数性能 Profiler.BeginSample("ParamsTest"); for (int i = 0; i < 100; i++) { ForeachString(Data.play, Data.one, Data.home, Data.play, Data.one, Data.home); } ...
UGUI问答
UGUI中的Image和RawImage的区别Image 组件Image 组件是UGUI中最常用的用于显示图像的组件。它支持多种图像类型(如Sprite、Sprite Atlas、Texture2D等),并且提供了一些方便的属性来调整图像的显示方式,如**color(颜色)、material(材质)、sprite**(精灵)等。
主要特点:
支持Sprite和Texture2D:可以直接使用Unity中的Sprite或Texture2D资源。
具有内置的颜色调整:可以通过**color**属性调整图像的颜色。
支持材质:可以通过**material**属性应用自定义的Shader效果。
12345678910111213141516using UnityEngine;using UnityEngine.UI; public class ImageExample : MonoBehaviour{ public Image myImage; // 拖拽赋值或通过代码查找 void Start() { // 设置Sprite(需要先在项 ...
OS
进程与线程基础异步
进程,线程,协程的区别?
1、进程
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。由于进程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。
2、线程
线程是进程的一个实体,是CPU调度和分配的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。线程间通信主要通过共享内存,上下文切换很快,资源开销较少,但相比进程不够稳定容易丢失数据。
3、协程
协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。
协程就 ...
光照与光照模型
前言
对应 《Games101》
07 着色(光照与基本着色模型)
13 光线追踪(基本原理)
《 Unity Shader 精要》
06 Unity中的基础光照
6.1模拟光照模拟真实光照环境来生成一张图像,需要考虑3种物理现象
首先,光线从光源射出
然后,光线和场景中的物体相交:一些被吸收,一些被散射到其他地方。
最后,摄像机吸收了一些光,产生一张图像。
在本章中,假设漫反射部分没有方向性,光线在所有方向上是平均分布的。同时,只考虑一个特定方向上的高光反射。
6.1.1 辐照度辐照度(irradiance):垂直于I的单位面积上单位时间穿过的能量
一般来说,光照都不会和平面垂直,因此需要使用光源方向和表面法线之间的夹角cos余弦值得到照射面积。
6.1.2 吸收和散射散射(scattering)和吸收(absorption)
散射只会改变光线的方向,而不改变光线的密度和颜色。
吸收只会改变光线的密度和颜色,而不会改变光线的方向。
折射(refraction)或 透射(transmission)
光线在物体表面经过散射后,会散射到内部,称之为 ...
建模入门Blender(持续更新)
基本操作物体模式6物体模式和编辑模式下的 合并与分离物体模式:
“CTRL+J”:“join”。合并选中的多个物体。合并后的轴心在最后选中物体的轴心。
Ctrl 1 2 平滑模式数字
编辑模式编辑模式基本操作“TAB键”:切换编辑模式/物体模式。
“CTRL+TAB键”: 切换顶点/边/面。
“A键”: 全选或者取消全选。
“SHIFT+鼠标左键”:多选点线面
挤出(在编辑模式下)“E键”:选中点,线,面都可以挤出,但一般主要对面操作。
挤出时右键取消实际上还是挤出了,只不过重叠在原有位置
沿法向挤出
挤出各个面
挤出到游标
环切左键确定后可以按“S键”然后移动坐标轴进行缩放环切线。缩放时可以直接输入缩放倍数,在左下角有显示缩放当前倍数。
内插面“I键”
倒角选中边,按“CTRL+B”进行倒角,此时可以滚动滚轮增加倒角边。
环切环切 :”CTRL+ R” 按鼠标右键后环切线置于中间位置
多根环切线:”CTRL+ R 之后再滑动滚轮
切割工具k键
平分工具几何体切开
桥接多边形建形Ctrl 建立三角形
旋绕工具平滑平滑 不会切分面
随机 随机面
滑移边线顶点滑移
法向缩放 ...
源码角度分析Rebuild和Rebatch
前言在 Unity 中,Rebuild 和 Rebatch 是优化 UI 渲染性能的重要概念。了解它们的原理可以帮助开发者优化游戏的性能,尤其是在使用 Unity 的 UI 系统时。
Rebuild什么是Rebuild当发生一些脏标记的行为时,被标记为脏的对象需要进行重新计算或渲染
图形组件Rebuild在渲染Canvas前一帧,会去判断Graphic是否被标记为脏标记,如果是顶点脏标记就会去重建网格,如果是材质被标记为脏那么就会去重建材质
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364//重建方法public virtual void Rebuild(CanvasUpdate update){ if (canvasRenderer == null || canvasRenderer.cull) return; switch (update) { ...