Unity C#高级特性 Partial 详细使用案例

news2024/11/14 6:55:21

文章目录

      • 实例 1:分隔UI逻辑
      • 实例 2:Unity编辑器自动生成代码
      • 实例 3:数据模型分割
      • 实例 4:序列化扩展
      • 实例 5:多视图架构
      • 实例 6:Unity编辑器自定义 inspectors

在Unity中,部分类(Partial Classes)是C#语言中的一个特性,它允许我们将一个类的定义分散到多个文件中。这意味着你可以在不同文件中为同一个类编写代码,编译器会自动将这些分散的部分合并成一个完整的类。

作用和优势:

  1. 代码组织性增强:对于大型项目或自动生成的代码(如Unity编辑器生成的MonoBehaviour脚本),可以使用partial classes将手动编写的逻辑与自动生成的代码分开。
  2. 团队协作:不同开发人员可以分别处理同一类的不同部分,而不会相互干扰。
  3. 保持自动生成代码的完整性:当你需要向由工具生成的类添加额外功能时,无需直接修改原始生成的代码,避免被后续工具更新覆盖。

5个实例说明:

实例 1:分隔UI逻辑

// File: MyScript.cs
partial class MyScript : MonoBehaviour
{
    public void CustomMethod()
    {
        Debug.Log("Custom method called.");
    }
}

// File: MyScript.UI.cs
// Unity不自动生成此部分,这是开发者自己添加的用于处理UI事件的代码
partial class MyScript : MonoBehaviour
{
    public void OnButtonClick()
    {
        CustomMethod();
    }
}

在这个例子中,MyScript 类的一部分用于实现通用游戏逻辑,另一部分专门处理UI事件。

实例 2:Unity编辑器自动生成代码

// File: AutoGenerated.cs (由Unity编辑器自动生成)
partial class MyPlayerController : MonoBehaviour
{
    private void Update()
    {
        // 自动化生成的运动逻辑...
    }
}

// File: MyPlayerController.cs
partial class MyPlayerController : MonoBehaviour
{
    public void PlayerJump()
    {
        // 开发者添加的跳跃功能实现...
    }

    [SerializeField] private float speed;
    private void FixedUpdate()
    {
        // 手动编写的物理移动逻辑...
    }
}

在此案例中,MyPlayerController 的一部分是Unity编辑器根据组件设置自动生成的,而另一部分则包含开发者手动添加的功能。

实例 3:数据模型分割

// File: GameData.cs
partial class GameData
{
    public int Health { get; set; }
    public int Mana { get; set; }
}

// File: GameData_Stats.cs
partial class GameData
{
    public int Strength { get; set; }
    public int Agility { get; set; }
    public int Intelligence { get; set; }
}

这里将游戏角色的数据模型属性分成两部分来管理,便于维护。

实例 4:序列化扩展

// File: SerializedData.cs (Unity编辑器生成)
[Serializable]
partial class SerializedData
{
    public string AutoGeneratedField;
}

// File: SerializedData_Custom.cs
[Serializable]
partial class SerializedData
{
    [HideInInspector] public List<Item> Inventory;
    public CustomData CustomSerializedData;
}

在这个例子中,Unity可能会为某个脚本生成一些默认字段,而开发者可以扩展该类,添加自己的可序列化的字段。

实例 5:多视图架构

// File: GameObjectModel.cs
partial class GameObjectModel
{
    public string Name { get; set; }
    public Vector3 Position { get; set; }
}

// File: GameObjectView.cs
partial class GameObjectModel
{
    public void UpdatePositionInScene()
    {
        // 更新场景中的对象位置...
    }
}

在复杂的应用场景下,类的部分可能专注于数据结构,而其他部分则关注于如何操作或展示这些数据(如视图层逻辑)。虽然这不是Unity典型的用法,但在某些架构设计中可能会这样划分。

注意:在Unity的实际使用中,由于MonoBehaviour的工作方式,将MonoBehaviour类分为多个部分的情况相对较少见,但确实可以用于组织代码。而在非Unity相关的C#应用中,partial classes的用途更为广泛。

实例 6:Unity编辑器自定义 inspectors

在Unity中,有时我们会为MonoBehaviour类编写自定义的Editor脚本来定制Inspector界面。这时,可以将MonoBehaviour的业务逻辑和Inspector相关逻辑分开到不同的partial class中。

// File: MyCustomComponent.cs
[RequireComponent(typeof(Collider2D))]
partial class MyCustomComponent : MonoBehaviour
{
    [SerializeField] private float speed;
    public int Health { get; set; }

    // 业务逻辑方法
    private void FixedUpdate()
    {
        transform.position += Vector3.right * speed * Time.fixedDeltaTime;
    }
}

// File: MyCustomComponent_Editor.cs
[CustomEditor(typeof(MyCustomComponent))]
public class MyCustomComponentEditor : Editor
{
    private SerializedProperty _speedProp;
    private SerializedProperty _healthProp;

    private void OnEnable()
    {
        _speedProp = serializedObject.FindProperty("speed");
        _healthProp = serializedObject.FindProperty("Health");
    }

    public override void OnInspectorGUI()
    {
        serializedObject.Update();

        EditorGUILayout.PropertyField(_speedProp);
        EditorGUILayout.IntSlider(_healthProp, 0, 100, new GUIContent("Health"));

        serializedObject.ApplyModifiedProperties();
    }
}

在这个例子中,MyCustomComponent 是一个MonoBehaviour,其核心功能(如运动逻辑)在第一个文件中定义。而在第二个文件 MyCustomComponent_Editor.cs 中,我们创建了一个自定义编辑器来调整Inspector展示方式,虽然这不是严格意义上的partial class,但是体现了对同一组件的不同方面进行模块化处理的思想。

通过这些实例,我们可以看到C#的partial classes特性在Unity项目中的多种应用场景,它有助于代码组织、团队协作以及保持与Unity编辑器自动生成代码的良好兼容性。

python推荐学习汇总连接:
50个开发必备的Python经典脚本(1-10)

50个开发必备的Python经典脚本(11-20)

50个开发必备的Python经典脚本(21-30)

50个开发必备的Python经典脚本(31-40)

50个开发必备的Python经典脚本(41-50)
————————————————

​最后我们放松一下眼睛
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1430221.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java基础:带参数的成员方法

上一篇博客中的成员方法是无参的&#xff0c;但成员方法其实是可以有参数的&#xff0c;可以增加代码的灵活性和健壮性。 本文以带一个参数的成员方法和带2个参数的成员方法为案例&#xff0c;加深对知识点的理解。 第一个成员方法&#xff08;带一个参数&#xff09;&#xf…

UE4学习笔记 FPS游戏制作2 制作第一人称控制器

文章目录 章节目标前置概念Rotator与Vector&#xff1a;roll与yaw与pitch 添加按键输入蓝图结构区域1区域2区域3区域4 章节目标 本章节将实现FPS基础移动 前置概念 Rotator与Vector&#xff1a; Vector是用向量表示方向&#xff0c;UE中玩家的正前方是本地坐标系的(1,0,0)&…

定义HarmonyOS IDL接口

HarmonyOS IDL简介 HarmonyOS Interface Definition Language&#xff08;简称HarmonyOS IDL&#xff09;是HarmonyOS的接口描述语言。HarmonyOS IDL与其他接口语言类似&#xff0c;通过HarmonyOS IDL定义客户端与服务端均认可的编程接口&#xff0c;可以实现在二者间的跨进程…

【C++】C++入门— 类与对象初步介绍

C入门 1 认识面向对象2 类的引入3 类的定义类的定义方式 4 类的访问限定符及封装访问限定符封装 Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;下一篇文章见&#xff01;&#xff01;&#xff01; 1 认识面向对象 C语言是面向过程的&#xff0c;关注…

睿尔曼6自由度机械臂ROS驱动包功能拓展之查询指令

1&#xff1a;主要环境预览 1&#xff1a;系统&#xff1a;Ubuntu 20.04 2&#xff1a;ROS&#xff1a;noetic 3&#xff1a;对于系统要求需根据相关手册完成机械臂相关依赖安装&#xff0c;能够运行机械臂本身基本功能&#xff0c; 包括 moveit。 4&#xff1a;准备资料…

星宸科技SSC8826Q 驾驶辅助(ADAS)行车记录仪方案

星宸科技SSC8826Q 驾驶辅助&#xff08;ADAS&#xff09;行车记录仪方案 一、方案描述 SSC8826Q是高度集成的行车记录仪、流媒体后视镜解决方案&#xff0c;主芯片为ARM Cortex A53&#xff0c;dual core&#xff0c;主频高达1.2GHz&#xff0c;集成了64-bit dual-core RISC 处…

向日葵案例解析:无外网接入,医疗设备如何进行远程售后运维

随着医学科学以及生物工程技术的高速发展&#xff0c;医院对于高端医疗设备如MR、CT、B超等高科技成像设备和放射治疗设备的需求激增。医学影像检查作为一种重要的手段&#xff0c;在许多疾病确诊过程中发挥着至关重要的作用。检查结果正确与否&#xff0c;直接影响临床医生对疾…

Java设计模式 – 四大类型

设计模式 – 四大类型 创建型模式结构型模式行为型模式J2EE模式 设计模式&#xff08;Design pattern&#xff09;是重构解决方案 根据书Design Patterns – Elements of Reusable Object-Oriented Software&#xff08;中文译名&#xff1a;设计模式 – 可复用的面向对象软件元…

STM32 HAL NTC(3950 10k)查表法

NTC&#xff08;Negative Temperature Coefficient&#xff09;是指随温度上升电阻呈指数关系减小、具有负温度系数的热敏电阻现象和材料。该材料是利用锰、铜、硅、钴、铁、镍、锌等两种或两种以上的金属氧化物进行充分混合、成型、烧结等工艺而成的半导体陶瓷&#xff0c;可制…

python绘图指南—Bokeh库从基础到高级打造交互式数据可视【第51篇—python:Bokeh库】

文章目录 Bokeh库深度解析&#xff1a;从基础到高级&#xff0c;打造交互式数据可视化安装Bokeh库Bokeh绘图基础基础图形绘制完善图形 实例演示案例&#xff1a;股票走势图 Bokeh库高级功能探索1. 工具栏和交互性2. 高级图形元素3. 数据链接和动态更新 Bokeh库与其他库的整合1.…

C# ONNX使用入门教程

背景 有新入坑的老哥不太了解C# onnx 运行的机理&#xff0c;我这边详细介绍一下&#xff0c;之前直接放官方的样例有点草率了。 准备[python环境] 1、要使用onnx&#xff0c;首先我们就自己生成一个onnx文件&#xff0c;请大家准备一下以下需要的[python]环境 python 版本…

linux 文件查看 head 、 cat 、 less 、tail 、grep

查看文件详细信息 stat 文件 cat 》》适合显示小文件【行数比较少】&#xff0c;如果行数较多&#xff0c;屏幕显示不完整&#xff08;如果虚拟操作&#xff0c;是无法上下键的&#xff0c;或者滚动鼠标的&#xff0c;第三方 xsheel&#xff0c;crt 可以方向键查看&#xf…

MySQL 多表查询

重点&#xff1a; MySQL 的 三种安装方式&#xff1a;包安装&#xff0c;二进制安装&#xff0c;源码编译安装。 MySQL 的 基本使用 MySQL 多实例 DDLcreate alter drop DML insert update delete DQL select 3.5&#xff09;DDL 语句 表&#xff1a;二维关系 设计表&…

【微服务】skywalking自定义链路追踪与日志采集

目录 一、前言 二、自定义链路追踪简介 2.1 自定义链路追踪应用场景 2.2 链路追踪几个关键概念 三、skywalking 自定义链路追踪实现 3.1 环境准备 3.2 集成过程 3.2.1 导入核心依赖 3.2.2 几个常用注解 3.2.3 方法集成 3.2.4 上报追踪信息 四、skywalking 自定义日志…

Spring速成(二)

Spring速成&#xff08;二&#xff09; 掌握IOC/DI配置管理第三方bean掌握IOC/DI的注解开发掌握IOC/DI注解管理第三方bean完成Spring与Mybatis及Junit的整合开发 1&#xff0c;IOC/DI配置管理第三方bean 1.1 案例:数据源对象管理 1.1.1 环境准备 学习之前&#xff0c;先来准…

STM32标准库——(9)TIM编码器接口

1.编码器接口简介 Encoder Interface 编码器接口编码器接口可接收增量&#xff08;正交&#xff09;编码器的信号&#xff0c;根据编码器旋转产生的正交信号脉冲&#xff0c;自动控制CNT自增或自减&#xff0c;从而指示编码器的位置、旋转方向和旋转速度每个高级定时器和通用定…

异步编程Completablefuture使用详解----进阶篇

JDK版本&#xff1a;jdk17 IDEA版本&#xff1a;IntelliJ IDEA 2022.1.3 文章目录 前言一、异步任务的交互1.1 applyToEither1.2 acceptEither1.3 runAfterEither 二、get() 和 join() 区别三、ParallelStream VS CompletableFuture3.1 使用串行流执行并统计总耗时3.2 使用并行…

单元/集成测试服务

服务概述 单元/集成测试旨在证明被测软件实现其单元/架构设计规范、证明被测软件不包含非预期功能。经纬恒润测试团队拥有丰富的研发经验、严格的流程管控&#xff0c;依据ISO26262/ASPICE等开展符合要求的单元测试/集成测试工作。 在ISO 26262 - part6 部分产品开发&#xff…

荣耀手机如何录屏?在线分享3个录屏方法

荣耀手机如何录屏&#xff1f;荣耀手机录屏是一项非常实用的功能&#xff0c;它可以帮助我们轻松记录手机屏幕上的内容&#xff0c;无论是游戏攻略、教育学习还是工作演示&#xff0c;都能够方便地进行录制。通过录屏&#xff0c;我们可以随时随地记录和分享自己的操作和见解。…

C++ 动态规划 线性DP 最长上升子序列

给定一个长度为 N 的数列&#xff0c;求数值严格单调递增的子序列的长度最长是多少。 输入格式 第一行包含整数 N 。 第二行包含 N 个整数&#xff0c;表示完整序列。 输出格式 输出一个整数&#xff0c;表示最大长度。 数据范围 1≤N≤1000 &#xff0c; −109≤数列中的数…