
环境搭建
当您在项目中安装 HDRP 或 URP 时,Unity 也会自动安装 Shader Graph 包。您可以使用包管理器手动安装 Shader Graph,以在 Unity 2021.2 及更高版本中使用内置渲染管线。
提示
Shader Graph 对 Unity 2021.2 及更高版本内置渲染管线的支持仅出于兼容性目的。除了现有功能的错误修复外,Shader Graph 不会为内置渲染管线支持提供更新。建议使用 Shader Graph 与可编写渲染管线。
当您在项目中安装 HDRP 或 URP 时,Unity 也会自动安装 Shader Graph 包。您可以使用包管理器手动安装 Shader Graph,以在 Unity 2021.2 及更高版本中使用内置渲染管线。
提示
Shader Graph 对 Unity 2021.2 及更高版本内置渲染管线的支持仅出于兼容性目的。除了现有功能的错误修复外,Shader Graph 不会为内置渲染管线支持提供更新。建议使用 Shader Graph 与可编写渲染管线。
DrawCall 的数量直接影响游戏的渲染性能。每一个 DrawCall 都需要 CPU 去处理,并消耗 GPU 的渲染资源。当 DrawCall 数量过多时,会导致 CPU 和 GPU 的负担加重,进而影响游戏的帧率和流畅度。特别是在移动设备上,由于硬件性能的限制,过多的 DrawCall 更容易导致游戏卡顿和掉帧。
注意
注意
using UnityEngine;
public class MaterialPropertyBlockColorTest : MonoBehaviour
{
public Renderer[] targetRenderers; // 拖入3个物体的Renderer
public Color[] colors = { Color.red, Color.green, Color.blue };
void Start()
{
if (targetRenderers == null || targetRenderers.Length != 3)
{
Debug.LogError("请拖入3个Renderer!");
return;
}
// 确保所有物体使用相同的材质实例
Material sharedMaterial = targetRenderers[0].sharedMaterial;
for (int i = 0; i < targetRenderers.Length; i++)
{
targetRenderers[i].sharedMaterial = sharedMaterial; // 强制共享材质
}
// 用 MaterialPropertyBlock 设置不同颜色
for (int i = 0; i < targetRenderers.Length; i++)
{
MaterialPropertyBlock block = new MaterialPropertyBlock();
block.SetColor("_BaseColor", colors[i]);
targetRenderers[i].SetPropertyBlock(block);
Debug.Log($"物体 {i} 颜色设置为: {colors[i]}");
}
}
}
SpriteAtlas atlas = Resources.Load<SpriteAtlas>("PathToAtlas");
Sprite sprite = atlas.GetSprite("SpriteName");
Image image = GetComponent<Image>();
image.sprite = sprite;
// 同一个材质,开启 GPU Instancing
MaterialPropertyBlock block = new MaterialPropertyBlock();
block.SetColor("_Color", Color.red);
renderer.SetPropertyBlock(block); // 不打破 instancing
#pragma multi_compile_instancing
UNITY_INSTANCING_BUFFER_START(Props)
UNITY_DEFINE_INSTANCED_PROP(float4, _Color)
UNITY_INSTANCING_BUFFER_END(Props)
using UnityEngine;
public class MeshCombineTest : MonoBehaviour
{
public MeshFilter[] meshFilters;
void Start()
{
if (meshFilters == null || meshFilters.Length == 0)
return;
// 1. 创建 CombineInstance 数组
CombineInstance[] combines = new CombineInstance[meshFilters.Length];
for (int i = 0; i < meshFilters.Length; i++)
{
combines[i].mesh = meshFilters[i].sharedMesh;
// 关键修改:使用 localToWorldMatrix 保留位置/旋转/缩放
combines[i].transform = meshFilters[i].transform.localToWorldMatrix;
// 2. 禁用原始 MeshRenderer(避免重复渲染)
MeshRenderer renderer = meshFilters[i].GetComponent<MeshRenderer>();
if (renderer != null)
renderer.enabled = false;
}
// 3. 创建合并后的 Mesh
Mesh combinedMesh = new Mesh();
combinedMesh.CombineMeshes(combines); // 合并所有 Mesh
// 4. 赋值给当前 GameObject
MeshFilter myFilter = GetComponent<MeshFilter>();
if (myFilter == null)
myFilter = gameObject.AddComponent<MeshFilter>();
myFilter.mesh = combinedMesh;
// 5. 确保有 Renderer 并复制第一个材质(简单处理)
MeshRenderer myRenderer = GetComponent<MeshRenderer>();
if (myRenderer == null)
myRenderer = gameObject.AddComponent<MeshRenderer>();
if (meshFilters.Length > 0 && meshFilters[0].GetComponent<MeshRenderer>() != null)
{
myRenderer.material = meshFilters[0].GetComponent<MeshRenderer>().sharedMaterial;
}
}
}
public class UICanvasRenderer : MonoBehaviour
{
private CanvasRenderer canvasRenderer;
void Start()
{
canvasRenderer = GetComponent<CanvasRenderer>();
canvasRenderer.sortingOrder = 1;
}
}
public class UIMask : MonoBehaviour
{
public RectTransform maskRect;
void Start()
{
Mask mask = gameObject.AddComponent<Mask>();
mask.showMaskGraphic = false;
mask.rectTransform = maskRect;
}
}
想要实现通信,首先,需要两台计算机精确的找到彼此的位置。要想交换信息,还需要双方共同遵守一定的通信规则即通信协议。否则,双方无法收发或者理解彼此的消息。
为了将人们读写的明文信息转为能在网络上不同节点间传播的电信号,网络协议的实现较为繁杂。为了降低复杂性,网络协议通常按照层次化结构方式来组织设计。每一层完成特定功能并通过接口为它的上一层提供服务。我们所说的节点间通信协议,实际上是说节点间对等层之间的通信协议。比如:物理层协议、传输层协议和应用层协议等等。
--------------------------------
下面是安装 mysql 8.0 server 步骤
--------------------------------
su
apt update
apt upgrade -y
apt install mysql-server
systemctl start mysql
systemctl enable mysql
systemctl status mysql
mysql_secure_installation 依次选择 Y
mysql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; # your_password 替换为你希望设置的密码
FLUSH PRIVILEGES; # 刷新权限
CREATE DATABASE TEST_DB; # 创建数据库
CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypassword'; # 8.0以上版本用法
GRANT ALL PRIVILEGES ON mydatabase.* TO 'myuser'@'localhost'; # myuser - 用户名
FLUSH PRIVILEGES;
EXIT;
nano /etc/mysql/mysql.conf.d/mysqld.cnf # 设置用户远程访问权限
bind-address = 0.0.0.0
systemctl restart mysql
GRANT ALL PRIVILEGES ON mydatabase.* TO 'myuser'@'%'; # 授权用户远程登陆
FLUSH PRIVILEGES;
mysql -u AARON -p -h localhost # 验证新用户AARON是否创建和授权成功
nginx 在大型系统架构中担任高性能 web 服务器、反向代理负载均衡器、高性能流量网关、应用网关、日志服务器等,是互联网项目的一个主要入口,主要特点有:安全、稳定、高性能。
可以通过多虚拟主机实现多域名绑定同一 ip,nginx 通过域名判断后访问不同站点。
windows下修改 hosts 文件,在文档结尾处新增一行记录 虚拟机IP aaron.com。
例如:192.168.3.100 aaron.com
浏览器中输入:http://aaron.com/ 这样就可以访问到虚拟主机中 nginx 服务器网站主页。
<= 3
,按约定自动标注;图层约定:
标签约定:
type = block|text|shape|edge|node|data
;root
,一级目录统一为indicator#${一级目录名称}
,二级目录统一为line#${二级目录名称}
,叶节点为${type}
;root
,一级目录统一为indicator#${一级目录名称}
,叶节点为${type}
;root
,叶节点为${type}
。名称约定:
${车站名称}-${车站名称}
;元素标注:
项目-名称:sycocc#waterPump
。waterPump、fire、train、deviceAlarm
。说明
假设算法要解决问题的输入规模是 n