网易首页 > 网易号 > 正文 申请入驻

UVP 价值专家 | 主程必杀技:Unity C# 代码整洁之道(四)

0
分享至

这篇文章来自 人选 Laugh。Laugh 专注游戏研发及管理 15 年,目前在巨人网络担任技术负责人、专家,负责 MMO 类型的架构设计、产线设计及团队建设。他在 Unity 官方开发者社区发布了“主程必杀技”系列文章,探索使用 Source Generator 和 Analyzer 在 Unity 中实现代码规范框架要求的方式,帮助主程更高效地进行技术管理。

点击阅读原文,可以访问 Laugh 在 Unity 官方开发者社区的个人主页,阅读更多技术干货。

在本系列的前三篇文章中,我们通过开发 Analyzer 尝试了 包括逻辑分支 (if...else...) 的写法,并实现了 、自动化执行 等要求,不符合要求的代码会直接报 Error 且无法编译,方便主程进行代码规范管理和框架要求,而不再需要花费大量时间 Review。

本文为大家带来 Laugh 的“主程必杀技”系列文章第四篇《 Unity C# 自动化执行代码规范-检查继承关系 》。更多技术分享,请访问 Laugh 的 Unity 官方开发者社区主页 ,持续关注学习。

https://developer.unity.cn/u/xiao-wei-58?tab=article

演示代码

获取链接:

https://gitee.com/palang/unity-sharp-code-regulator.git

C# Code Analyzer 入门系列文章

⦁ Analyzer 初体验:强制使用大括号包括逻辑分支 (if...else...)

⦁ 强制加注释(上)类注释 | 强制加注释(下)方法注释

⦁ 命名规范检查(一)命名空间和类名

⦁ 命名规范检查(二)public 和 private 方法名称规范检查

⦁ 命名规范检查(三)成员变量命名规范检查

⦁ 命名规范检查(四)临时变量命名检查

⦁ 检查继承关系

Unity C# 自动化执行代码规范

检查继承关系

Unity 中,很多类,我们不希望继承自 MonoBehaviour(主要考虑到性能和自己控制生命周期)。比如我们的 MVC 中的 Controller,或者战斗系统中的 SkillLogic,希望脱离 Unity 的 Monobehavior 及其生命周期的控制,通常会自定义帧驱动逻辑。

看本篇文章之前,请先阅读 ,环境准备工作也与前几篇保持一致。

实现目标

为了实现自己控制的帧驱动逻辑,我在项目定义了 IFrameDrivable 接口(其中有OnFrameUpdate 等方法,不是这里的重点,可以忽略)。

我希望实现 IFrameDrivable 的类,不能继承自 MonoBehaviour 类。

编写 Analyzer 分析器

首先在类 DianogsticIDs 中定义新的错误 ID:

public const string FORCE_NAMING_CONVENTIONS_ID= "FERR1004";

然后在 AnalyzerReleases.Unshipped.md 文件添加该规则,如下:

定义分析器类

新建分析器类 ForbidInheritFromMonoBehavor.cs,内容如下(具体步骤请看代码中的注释)

using Microsoft.CodeAnalysis.Diagnostics;
using Microsoft.CodeAnalysis;
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections.Immutable;
using Analyzer;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using System.Linq;

namespace CdeAnalyzer
{
/**
* Author: Laugh(笑微)
* https://developer.unity.cn/projects/65937455edbc2a001cbd8102
*/
[DiagnosticAnalyzer(LanguageNames.CSharp)]
internal class ForbidInheritFromMonoBehavor : DiagnosticAnalyzer
{
///

/// 错误描述
///
private static readonly DiagnosticDescriptor ForbidInheritDescriptor =
new DiagnosticDescriptor(
DianogsticIDs.FORCE_FORBID_INHERIT_MONOBEHAVIOR_ID, // ID
"实现了IFrameDrivable接口的类,不能继承自MonoBehavior", // Title
"实现了IFrameDrivable接口的类,不能继承自MonoBehavior", // Message format
DiagnosticCategories.Criterion, // Category
DiagnosticSeverity.Error, // Severity
isEnabledByDefault: true // Enabled by default
);
public override ImmutableArray SupportedDiagnostics => ImmutableArray.Create(ForbidInheritDescriptor);

///

/// 初始化分析方法
///
///
public override void Initialize(AnalysisContext context)
{
context.RegisterSyntaxTreeAction(AnalyzeSymbol);
}
///

/// 检测方法
///
///
private static void AnalyzeSymbol(SyntaxTreeAnalysisContext context)
{
//找到文档的语法根树
var root = context.Tree.GetRoot(context.CancellationToken);
if (ConstraintDefinition.ExcludeAnalize(context.Tree.FilePath))
{//排除特殊目录
return;
}

var classList = root.DescendantNodes()?.OfType ();
foreach(var cls in classList)
{//遍历语法树中的所有类
var baseClsList = cls.BaseList?.ChildNodes()?.OfType ();
if (baseClsList == null)
{
break;
}
bool isMonoBehavior = false;
bool isFrameDrivable = false;
foreach (var bcls in baseClsList)
{
var idName = bcls.ChildNodes()?.OfType ()?.First();
var bname = idName.ToString();
if(bname == "IFrameDrivable")
{//检查是否实现了接口IFrameDrivable
isFrameDrivable = true;
}
else if (bname == "ArrayList")
{//检查是否继承自MonoBehavior
isMonoBehavior = true;
}
}
if (isFrameDrivable && isMonoBehavior)
{
//报错
var diagnostic = Diagnostic.Create(ForbidInheritDescriptor, cls.GetFirstToken().GetLocation());
context.ReportDiagnostic(diagnostic);
}
}

}
}
}

Laugh 是 人选。Unity 价值专家(UVP)是通过原创作品启发国内创作者的 Unity 专业人员,欢迎提名/自荐。

https://unity.cn/uvp

阔别重逢,终于回来了!

7月23日-25日,Unite 将于上海隆重开启。1 场 Keynote 和多个专场,涵盖团结引擎、游戏生态、数字孪生、智能座舱等多重赛道,我们还准备了小而美的工作坊,覆盖小游戏、开源鸿蒙、Vision Pro三大主题。

走过路过别错过。

扫码购票处

Unity 官方微信

第一时间了解Unity引擎动向,学习进阶开发技能

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
痛惜!衡阳5死2伤火灾背后:无物业老小区的生存困境

痛惜!衡阳5死2伤火灾背后:无物业老小区的生存困境

老猫观点
2026-05-13 06:45:49
信立泰两日跌停!25天蒸发45%,500亿白马栽在JK07临床数据

信立泰两日跌停!25天蒸发45%,500亿白马栽在JK07临床数据

慧眼看世界哈哈
2026-05-12 20:39:23
佛山一套法拍别墅带800平米花园,5800万元起拍,园内16棵树木估价76万元

佛山一套法拍别墅带800平米花园,5800万元起拍,园内16棵树木估价76万元

极目新闻
2026-05-12 23:57:32
辽宁一出租车顶灯亮起“我被打劫,请报警”,警方:未接到相关警情,经与当事司机联系核实,系其误按报警器

辽宁一出租车顶灯亮起“我被打劫,请报警”,警方:未接到相关警情,经与当事司机联系核实,系其误按报警器

台州交通广播
2026-05-13 00:35:47
白宫公布名单,16位美国商界领袖将随特朗普访华

白宫公布名单,16位美国商界领袖将随特朗普访华

界面新闻
2026-05-12 21:23:09
前脚刚考上公务员获公示,他转身就将摄像头伸进女生裙底!这一次真的该感谢举报者

前脚刚考上公务员获公示,他转身就将摄像头伸进女生裙底!这一次真的该感谢举报者

潇拾亿郎
2026-05-12 18:03:02
美国B-29迫降苏联后,斯大林下令:全面模仿,连钻错的洞都不准改!

美国B-29迫降苏联后,斯大林下令:全面模仿,连钻错的洞都不准改!

爆角追踪
2026-05-12 17:13:53
不能二次加热的6种食物!医生提醒:吃不完或倒掉,别乱节俭

不能二次加热的6种食物!医生提醒:吃不完或倒掉,别乱节俭

冷眼看世界728
2026-05-12 20:46:26
两次嫁给梁靖崑,退圈安心照顾两个儿子,如今丈夫成为大学教授

两次嫁给梁靖崑,退圈安心照顾两个儿子,如今丈夫成为大学教授

往史过眼云烟
2026-05-12 22:04:20
特朗普上飞机前坦白,对华称呼已变,美参议员:绝不能向华让步

特朗普上飞机前坦白,对华称呼已变,美参议员:绝不能向华让步

云舟史策
2026-05-13 07:27:57
特朗普应邀访华三天,中方准备了高规格礼遇,他想邀中方回访美国

特朗普应邀访华三天,中方准备了高规格礼遇,他想邀中方回访美国

忠于法纪
2026-05-12 17:29:09
以前叫人家强哥,现在请叫植物

以前叫人家强哥,现在请叫植物

阿亮评论
2026-05-12 12:18:33
父亲病危后女子请假陪护屡遭拒,父亲去世当天她因“旷工”被公司辞退,此前公司还向其发送旷工催告函;法院:公司于期限内支付70000元

父亲病危后女子请假陪护屡遭拒,父亲去世当天她因“旷工”被公司辞退,此前公司还向其发送旷工催告函;法院:公司于期限内支付70000元

极目新闻
2026-05-13 07:57:10
“我不配做你女儿……”河南13岁少女斥18万陷“画圈乱象”事件,背后的水太深了……

“我不配做你女儿……”河南13岁少女斥18万陷“画圈乱象”事件,背后的水太深了……

桌子的生活观
2026-05-12 12:26:38
58岁日本籍主帅神了:率中国男足绝境爆发,时隔21年杀入世界杯赛场

58岁日本籍主帅神了:率中国男足绝境爆发,时隔21年杀入世界杯赛场

侧身凌空斩
2026-05-13 02:15:26
浙大郑强教授:我不承认中国大学生就业难,是舒服的工作难找,建议少点抱怨少点索取

浙大郑强教授:我不承认中国大学生就业难,是舒服的工作难找,建议少点抱怨少点索取

TOP大学来了
2026-05-11 16:39:00
1-1!C罗摇头叹息,胜利遭98分钟压哨绝平,新月重燃夺冠希望

1-1!C罗摇头叹息,胜利遭98分钟压哨绝平,新月重燃夺冠希望

我的护球最独特
2026-05-13 04:11:44
程维高并非被一撸到底,下台后享受副省级待遇,活了78岁

程维高并非被一撸到底,下台后享受副省级待遇,活了78岁

史不语
2026-05-13 08:10:10
老伴凌晨心梗,我连打女儿38个电话没人接,直到女婿接电话:爸,能不能懂点分寸?出院那天,我直接停掉他们房贷.....

老伴凌晨心梗,我连打女儿38个电话没人接,直到女婿接电话:爸,能不能懂点分寸?出院那天,我直接停掉他们房贷.....

LULU生活家
2026-05-12 19:00:01
远离造神陷阱!曾经一夜爆红的郭有才,终于替自己的荒唐付出代价

远离造神陷阱!曾经一夜爆红的郭有才,终于替自己的荒唐付出代价

飘逸语人
2026-05-12 22:59:35
2026-05-13 09:47:00
Unity incentive-icons
Unity
Unity中国官方帐户
2466文章数 6732关注度
往期回顾 全部

科技要闻

谷歌剧透安卓重大升级 Gemini深度集成底层

头条要闻

牛弹琴:印度的大麻烦来了 CNN的报道更是触目惊心

头条要闻

牛弹琴:印度的大麻烦来了 CNN的报道更是触目惊心

体育要闻

骑士终于玩明白了?

娱乐要闻

白鹿风波升级!掉粉20万评论区沦陷

财经要闻

深圳夫妻囤芯片,身家飙涨320亿

汽车要闻

吉利银河“TT”申报图曝光 电动尾翼+激光雷达

态度原创

艺术
教育
本地
健康
家居

艺术要闻

这位女摄影师的航拍风景照片,简直太美了!

教育要闻

西电就业,大变天!

本地新闻

用苏绣的方式,打开江西婺源

干细胞能让人“返老还童”吗

家居要闻

极简主义下的居住场域与空间

无障碍浏览 进入关怀版