ECS框架文档翻译十一 System Update Order

本文档详细介绍了Unity的ECS框架中系统更新顺序的管理方式,包括Component System Groups、System Ordering Attributes以及默认系统组。通过[UpdateInGroup]、[UpdateBefore]和[UpdateAfter]属性来调整系统在组内的顺序。此外,还提到了多世界环境下系统更新的处理,并提供了技巧和提示,强调了避免在ComponentSystemGroup中添加业务逻辑。

以下文档均来源于ECS官网:

https://docs.unity3d.com/Packages/com.unity.entities@0.0/manual/ecs_entities.html

System Update Order(系统更新顺序)

要使用“组件系统组”来指定系统的更新顺序,您可以在你的system类的声明中加入[UpdateInGroup]属性,这会将你的system放入到一个系统组中。 然后,您可以使用[UpdateBefore]和[UpdateAfter]属性来指定此system在系统组内的更新顺序。

ECS框架创建一系列的默认系统组,您可以使用这些系统组在每帧对应的阶段来更新系统。 您可以将一个组嵌套在另一个组中,以便你的整个系统组在正确的阶段更新的同时,组内各系统之间据各自在组内的顺序进行更新。

Component System Groups(组件系统组)

ComponentSystemGroup类存储了一组相关联的组件系统,它们将按照指定的顺序一起更新。 ComponentSystemGroup派生自ComponentSystemBase,因此在所有重要方面它都与组件系统一样 -- 它可以相对于其他系统进行排序、具有一个OnUpdate()方法等。最重要的是,这就意味着组件系统组可以嵌套在其他的组件系统组内部,形成层次结构。

默认情况下,当调用ComponentSystemGroup的Update()方法时,它会在其子系统列表中的每个子系统上调用Update()。 如果任何子系统本身就是系统组,那么它们将递归更新自己的子系统。 最终会产生一棵系统树,遍历顺序遵循深度优先。

System Orderin

[root@yfw ~]# cd /www/wwwroot/szrengjing.com [root@yfw szrengjing.com]# chmod +x /www/wwwroot/szrengjing.com/setup_credit_system.sh [root@yfw szrengjing.com]# cd /www/wwwroot/szrengjing.com [root@yfw szrengjing.com]# ./setup_credit_system.sh 🚀 开始部署用户信用系统... ERROR 1064 (42000) at line 48: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 7 ❌ 部署失败,请检查 SQL 错误。 [root@yfw szrengjing.com]# #!/bin/bash # 配置变量 DB_NAME="szrengjing_com" DB_USER="szrengjing_com" PASSWORD_FILE="/root/.my.cnf" echo "🚀 开始部署用户信用系统..." # 执行 SQL 操作 mysql --defaults-file=$PASSWORD_FILE << EOF USE \`${DB_NAME}\`; -- 创建信用主表 CREATE TABLE IF NOT EXISTS ecs_user_credit ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NOT NULL UNIQUE, score INT DEFAULT 80, level VARCHAR(20) AS ( CASE WHEN score >= 95 THEN '★★★★★' WHEN score >= 85 THEN '★★★★☆' WHEN score >= 75 THEN '★★★☆☆' WHEN score >= 60 THEN '★★☆☆☆' ELSE '★☆☆☆☆' END ) STORED, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 创建信用日志表 CREATE TABLE IF NOT EXISTS ecs_user_credit_log ( id BIGINT AUTO_INCREMENT PRIMARY KEY, user_id INT NOT NULL, old_score INT, new_score INT, change_value INT, reason VARCHAR(100), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 删除旧触发器和存储过程 DROP TRIGGER IF EXISTS tr_after_update_credit; DROP PROCEDURE IF EXISTS sp_add_credit; -- 创建触发器自动记录变更 DELIMITER ;; CREATE TRIGGER tr_after_update_credit AFTER UPDATE ON ecs_user_credit FOR EACH ROW BEGIN INSERT INTO ecs_user_credit_log (user_id, old_score, new_score, change_value, reason) VALUES (NEW.user_id, OLD.score, NEW.score, NEW.score - OLD.score, '系统调整'); END;; DELIMITER ; -- 创建存储过程用于安全加分/减分 CREATE PROCEDURE sp_add_credit( IN p_user_id INT, IN p_change INT, IN p_reason VARCHAR(100) ) BEGIN DECLARE current_score INT DEFAULT 80; -- 查询当前分数(加锁防止并发) SELECT score INTO current_score FROM ecs_user_credit WHERE user_id = p_user_id FOR UPDATE; -- 更新分数 INSERT INTO ecs_user_credit (user_id, score) VALUES (p_user_id, current_score + p_change) ON DUPLICATE KEY UPDATE score = score + p_change; -- 触发器会自动记录日志 END;; EOF # 检查是否成功 if [ $? -eq 0 ]; then echo "✅ 用户信用系统部署完成!" else echo "❌ 部署失败,请检查 SQL 错误。" exit 1 fi # 显示当前数据 echo "" echo "📊 当前用户信用状态:" mysql --defaults-file=$PASSWORD_FILE -Nse "USE ${DB_NAME}; SELECT user_id, score, level FROM ecs_user_credit;" | \ while read user_id score level; do printf "%-8s %-6s %s\n" "User:$user_id" "Score:$score" "Level:$level" done echo "" echo "📝 最近信用日志:" mysql --defaults-file=$PASSWORD_FILE -Ee "USE ${DB_NAME}; SELECT * FROM ecs_user_credit_log ORDER BY id DESC LIMIT 5;"
11-10
#!/bin/bash # 配置变量 DB_NAME="szrengjing_com" PASSWORD_FILE="/root/.my.cnf" echo "🚀 开始部署用户信用系统..." # 使用 mysql 执行多行 SQL(不用 DELIMITER) mysql --defaults-file=$PASSWORD_FILE << 'MYSQL_END' USE szrengjing_com; -- 创建信用主表 CREATE TABLE IF NOT EXISTS ecs_user_credit ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NOT NULL UNIQUE, score INT DEFAULT 80, level VARCHAR(20) AS ( CASE WHEN score >= 95 THEN '★★★★★' WHEN score >= 85 THEN '★★★★☆' WHEN score >= 75 THEN '★★★☆☆' WHEN score >= 60 THEN '★★☆☆☆' ELSE '★☆☆☆☆' END ) STORED, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 创建信用日志表 CREATE TABLE IF NOT EXISTS ecs_user_credit_log ( id BIGINT AUTO_INCREMENT PRIMARY KEY, user_id INT NOT NULL, old_score INT, new_score INT, change_value INT, reason VARCHAR(100), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 删除旧触发器和存储过程 DROP TRIGGER IF EXISTS tr_after_update_credit; DROP PROCEDURE IF EXISTS sp_add_credit; -- 创建触发器自动记录变更 CREATE TRIGGER tr_after_update_credit AFTER UPDATE ON ecs_user_credit FOR EACH ROW BEGIN INSERT INTO ecs_user_credit_log (user_id, old_score, new_score, change_value, reason) VALUES (NEW.user_id, OLD.score, NEW.score, NEW.score - OLD.score, '系统调整'); END; -- 创建存储过程用于安全加分/减分 CREATE PROCEDURE sp_add_credit( IN p_user_id INT, IN p_change INT, IN p_reason VARCHAR(100) ) BEGIN DECLARE current_score INT DEFAULT 80; -- 查询当前分数(加锁防止并发) SELECT score INTO current_score FROM ecs_user_credit WHERE user_id = p_user_id FOR UPDATE; -- 更新分数 INSERT INTO ecs_user_credit (user_id, score) VALUES (p_user_id, current_score + p_change) ON DUPLICATE KEY UPDATE score = score + p_change; END; MYSQL_END # 检查是否成功 if [ $? -eq 0 ]; then echo "✅ 用户信用系统部署完成!" else echo "❌ 部署失败,请检查 SQL 错误。" exit 1 fi # 显示当前数据 echo "" echo "📊 当前用户信用状态:" mysql --defaults-file=$PASSWORD_FILE -Nse "USE ${DB_NAME}; SELECT user_id, score, level FROM ecs_user_credit;" | \ while read user_id score level; do printf "%-8s %-6s %s\n" "User:$user_id" "Score:$score" "Level:$level" done echo "" echo "📝 最近信用日志:" mysql --defaults-file=$PASSWORD_FILE -Ee "USE ${DB_NAME}; SELECT * FROM ecs_user_credit_log ORDER BY id DESC LIMIT 5;" 生成一个完整版吗
11-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值