Unity 中的接口和继承

        在Unity的游戏开发中,理解面向对象编程的概念,如类、接口、继承和多态性,是非常重要的。本文旨在帮助理解和掌握Unity中接口和继承的概念,以及如何在实际项目中应用这些知识。

类和继承

        在C#和Unity中,类是构建应用程序的基本单位。类可以包含数据(字段)和行为(方法)。类之间的一种关系是继承,其中一个类(子类)可以继承另一个类(基类或父类)的成员。

举例说明:

        假设我们在制作一个游戏,需要表示不同种类的游戏角色。我们可以定义一个基类 GameCharacter 和两个派生类 WarriorMage

基类(父类)示例

public class GameCharacter
{public float Health { get; set; }public float Speed { get; set; }public void Move(){// 实现角色移动的代码}public virtual void Attack(){// 基本攻击行为的实现}
}

        在这个基类 GameCharacter 中,我们定义了两个字段 HealthSpeed,以及两个方法 MoveAttackAttack 方法被标记为 virtual,这意味着它可以在子类中被重写。 

子类示例

public class Warrior : GameCharacter
{public float Strength { get; set; }public override void Attack(){// 战士特有的攻击行为的实现}
}public class Mage : GameCharacter
{public float Mana { get; set; }public override void Attack(){// 法师特有的攻击行为的实现}
}

        在这两个子类 WarriorMage 中,我们继承了 GameCharacter 类,并添加了各自特有的属性(StrengthMana)。同时,我们重写了 Attack 方法,以提供与基类不同的行为。

使用继承的优势

  • 代码重用WarriorMage 自动继承了 GameCharacterHealthSpeedMove 方法。我们不需要在每个类中重复这些代码。
  • 扩展性:通过继承,我们可以轻松添加新类型的游戏角色,而无需修改现有代码。
  • 多态性:我们可以将 WarriorMage 的对象视为 GameCharacter 的对象,这使得我们可以编写更通用的代码来处理不同类型的游戏角色。

        继承在C#和Unity开发中是一个非常强大的工具,它使得代码结构更加清晰,易于维护和扩展。通过理解和应用继承,开发者可以有效地构建复杂且灵活的应用程序。

抽象类

        抽象类是一种特殊类型的类,不能直接实例化。它通常用作其他类的基类,定义一些公共的功能和接口。子类必须提供抽象成员的具体实现。

举例说明:

        假设我们正在开发一个游戏,其中包含多种类型的NPC(非玩家角色)。我们可以创建一个抽象基类来定义所有NPC共有的功能和属性,同时留出一些必须由具体NPC类型实现的抽象成员。

抽象基类示例

public abstract class NPC
{public string Name { get; set; }public float Health { get; set; }public void Speak(){Console.WriteLine("Hello, I am an NPC.");}public abstract void PerformAction(); // 抽象方法
}

        在这个例子中,NPC 是一个抽象类,它包含两个属性(NameHealth)和一个具体实现的方法 Speak。此外,它还声明了一个抽象方法 PerformAction,该方法没有具体实现,需要由子类提供。

实现抽象基类的子类

       

public class Villager : NPC
{public override void PerformAction(){Console.WriteLine("The villager is farming.");}
}public class Guard : NPC
{public override void PerformAction(){Console.WriteLine("The guard is patrolling.");}
}

        在这两个子类 VillagerGuard 中,我们分别实现了抽象基类 NPC 中的 PerformAction 方法。每个子类提供了该方法的具体实现,反映了不同NPC类型的特定行为。

使用抽象类的优势

  • 强制实现:抽象类强制子类实现特定的抽象成员,确保子类遵循一定的规范。
  • 代码重用:抽象类可以包含非抽象成员(如 Speak 方法),这些成员被所有子类共享,减少了代码重复。
  • 设计灵活性:通过定义抽象类,我们可以创建出灵活的、可扩展的系统结构,允许开发者后续添加新类型的NPC,而无需修改现有的抽象类代码。

        抽象类是面向对象设计中的一个重要概念,它提供了一种强有力的方式来设计灵活且具有可扩展性的程序结构。理解并正确应用抽象类对于创建高效、可维护的C#和Unity应用程序至关重要。

接口

        接口是定义一组没有实现的方法的契约。实现接口的类必须提供这些方法的具体实现。接口是实现多态性的一种方式。

举例说明:

        假设我们正在开发一个游戏,需要处理不同类型的交互对象,例如玩家可以与之交谈或交易的NPC。

接口示例

public interface IInteractable
{void Interact();void Talk();
}

        在这个例子中,IInteractable 是一个接口,它定义了两个方法:InteractTalk。这两个方法没有具体的实现,代表了任何可交互对象应具备的行为。

实现接口的类

public class Merchant : IInteractable
{public void Interact(){Console.WriteLine("Welcome to my shop!");}public void Talk(){Console.WriteLine("Have you seen the latest goods?");}
}public class Villager : IInteractable
{public void Interact(){Console.WriteLine("Nice to meet you!");}public void Talk(){Console.WriteLine("I heard there's a storm coming.");}
}

        在这两个类 MerchantVillager 中,我们分别实现了接口 IInteractable 中的 InteractTalk 方法。每个类提供了这些方法的具体实现,反映了不同交互对象的特定行为。

使用接口的优势
  • 多态性:接口允许我们使用多态性,即可以用接口类型来引用实现了该接口的任何类的对象。这增加了代码的灵活性。
  • 灵活的设计:通过使用接口,我们可以编写更加灵活和可扩展的代码。可以轻松添加新的交互对象类型,而无需修改现有的接口或使用接口的代码。
  • 解耦:接口有助于减少类之间的耦合,使得不同的类可以独立变化而不影响其他类。

IInteractable interactable = new Merchant();
interactable.Interact();  // 输出 "Welcome to my shop!"
interactable = new Villager();
interactable.Interact();  // 输出 "Nice to meet you!"

        在这个例子中,我们使用 IInteractable 接口来引用 MerchantVillager 的对象。这使我们能够用同样的方式处理不同类型的交互对象,而不关心它们具体是哪个类的实例。

        接口是C#和Unity编程中实现多态性和灵活设计的关键工具。通过定义和实现接口,开发者可以创建出可互操作、易于维护和扩展的程序结构。

多态性

        多态性是面向对象编程的一个核心概念,它允许你将一个类的对象视为其父类或接口的对象,并调用在父类或接口中声明的方法。在运行时,会执行该对象的类中对这些方法的具体实现。

举例说明:

        假设我们正在开发一个动物园模拟器游戏,其中包含多种不同的动物。每种动物都会以其独特的方式发出声音。我们可以使用多态性来表示这些不同的行为。

父类和接口定义

        首先,我们定义一个基类 Animal 和一个方法 MakeSound,然后定义一个接口 IPlayable 与一个方法 Play

public abstract class Animal
{public abstract void MakeSound();
}public interface IPlayable
{void Play();
}

子类实现

        接着,我们创建几个继承自 Animal 并实现 IPlayable 接口的子类,每个子类都有自己的 MakeSoundPlay 方法实现。

public class Dog : Animal, IPlayable
{public override void MakeSound(){Console.WriteLine("Bark!");}public void Play(){Console.WriteLine("The dog is fetching the ball.");}
}public class Cat : Animal, IPlayable
{public override void MakeSound(){Console.WriteLine("Meow!");}public void Play(){Console.WriteLine("The cat is chasing a laser pointer.");}
}

多态性的应用

        现在我们可以编写一个接受 Animal 类型和 IPlayable 接口类型对象的代码,并调用它们的方法。在运行时,将调用实际对象类型的方法实现。

Animal myDog = new Dog();
Animal myCat = new Cat();
IPlayable playfulDog = myDog as IPlayable;
IPlayable playfulCat = myCat as IPlayable;myDog.MakeSound();  // 输出 "Bark!"
myCat.MakeSound();  // 输出 "Meow!"playfulDog.Play();  // 输出 "The dog is fetching the ball."
playfulCat.Play();  // 输出 "The cat is chasing a laser pointer."

        在这个例子中,myDogmyCat 虽然被声明为 Animal 类型,但它们分别指向 DogCat 的实例。因此,当调用 MakeSound 方法时,执行的是 DogCat 类中各自的 MakeSound 方法实现。同样,尽管 playfulDogplayfulCat 被声明为 IPlayable 接口类型,但它们执行的是各自类中的 Play 方法实现。

        这个例子展示了多态性如何使得我们能够以通用的方式处理不同类型的对象,同时保持每个对象类型特有的行为。这是面向对象编程中提高代码灵活性和可重用性的重要手段。

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

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

相关文章

WSL中遇到CondaHTTPError: HTTP 000 CONNECTION FAILED for url解决方法

文章目录 遇到问题解决方法参考 遇到问题 之前用WSL使用conda都是正常的,今天用的时候遇到CondaSSLError: Encountered an SSL error. Most likely a certificate verification issue. (base) lishizhengDESKTOP-8SJ6087:~$ conda update -n base -c defaults con…

Google Chrome RCE漏洞 CVE-2020-6507 和 CVE-2024-0517 流程分析

本文深入研究了两个在 Google Chrome 的 V8 JavaScript 引擎中发现的漏洞,分别是 CVE-2020-6507 和 CVE-2024-0517。这两个漏洞都涉及 V8 引擎的堆损坏问题,允许远程代码执行。通过EXP HTML部分的内存操作、垃圾回收等流程方式实施利用攻击。 CVE-2020-…

操作符详解(上)

目录 操作符的分类 二进制和进制转换 2进制转10进制 10进制转2进制数字 2进制转8进制 2进制转16进制 原码、反码、补码 移位操作符 左移操作符 右移操作符 位操作符:&、|、^、~ 单目操作符 逗号表达式 操作符的分类 • 算术操作符: …

【C++干货铺】 RAII实现智能指针

个人主页点击直达:小白不是程序媛 C系列专栏:C干货铺 代码仓库:Gitee 目录 为什么需要智能指针? 内存泄漏 什么是内存泄漏,内存泄露的危害 内存泄漏的分类 堆内存泄漏(Heap leak) 系统资…

CMG GPP 0.05°全球区域2000~2019年月数据分享

各位同学们好,今天分享的是CMG GPP 0.05全球区域2000~2019年月数据。您可以私信或评论。 一、数据简介 准确估算陆地植被的初级生产总值(GPP)对于了解全球碳循环和预测未来气候变化至关重要。目前有多种基于不同方法的 GPP 产品&#xff0c…

ORM-08-EclipseLink 入门介绍

拓展阅读 The jdbc pool for java.(java 手写 jdbc 数据库连接池实现) The simple mybatis.(手写简易版 mybatis) 1. EclipseLink概述 本章介绍了EclipseLink及其关键特性:包括在EclipseLink中的组件、元数据、应用程序架构、映射和API。 本…

Leetcode—29. 两数相除【中等】

2023每日刷题(九十四) Leetcode—29. 两数相除 叛逆期实现代码 class Solution { public:int divide(int dividend, int divisor) {if(dividend INT_MIN && divisor -1) {return INT_MAX;} return dividend / divisor;} };运行结果 倍增算法…

java多线程测试websocket demo(使用文件流)

这个demo主要是利用Java多线程来测试WebSocket通信。首先,创建一个WebSocket服务器和客户端,然后使用多线程来模拟多个客户端同时连接服务器进行通信。通过多线程测试,可以验证WebSocket通信的并发性能和稳定性。同时,可以通过多线…

第14章_数据结构与集合源码(一维数组,链表,栈,队列,树与二叉树,List接口分析,Map接口分析,Set接口分析,HashMap的相关问题)

文章目录 第14章_数据结构与集合源码本章专题与脉络1. 数据结构剖析1.1 研究对象一:数据间逻辑关系1.2 研究对象二:数据的存储结构(或物理结构)1.3 研究对象三:运算结构1.4 小结 2. 一维数组2.1 数组的特点2.2 自定义数…

内存屏障,写屏障和读屏障

目录 jmm: 写屏障和读屏障 jmm: Java 内存模型(Java Memory Model,简称 JMM)是一种规定了多线程环境中共享变量的访问规则的模型。它确保了在不同线程之间的可见性、有序性和原子性。以下是关于 Java 内存模型的一些…

HTTP简单的接收和发送

注释 简单的http通讯信息,可以适应简单的场景 void Start(){StartCoroutine(GetRequest("https://jsonplaceholder.typicode.com/posts/1"));StartCoroutine(PostRequest("https://jsonplaceholder.typicode.com","hahah"));}/// &…

【基础算法练习】前缀和与差分模板

文章目录 前缀和算法思想差分算法思想C 版本的前缀和模板一维前缀和二维前缀和 C 版本的差分模板一维差分二维差分 前缀和算法思想 用 O(N) 的复杂度构建前缀和数组,通过这种方式达成 O(1) 的时间来得到区间和,说是一种算法,其实可以说是一种…

何恺明 ResNet 引用量正式破20万!!!

注: 本文转自微信公众号 BravoAI (专注AI资讯和技术分享), 原文网址: 何恺明 ResNet 引用量正式破20万!!!, 扫码关注公众号 谷歌学术显示, 截止到 2024年1月26日, 何凯明 ResNet 一文引用量正式突破 20W!!! 更为惊人的是, 从论文发表到今天, 不过7年!!!‍‍‍‍‍‍‍‍‍‍‍‍…

springboot347基于web的铁路订票管理系统

获取源码——》公主号:计算机专业毕设大全

经典框架解读 | 论文+代码 | 3D Detection | OpenPCDet | PointRCNN

论文标题:PointRCNN: 3D Object Proposal Generation and Detection from Point Cloud 作者单位:The Chinese University of Hong Kong 代码:open-mmlab/OpenPCDet 论文:https://arxiv.org/pdf/1812.0424 第一次使用点云数据处理3D目标检测问题。 作者的观点: 1. 以前的…

预处理详解1❤

一:预定义符号 C语言中设置了一些预定义符号,它们可以直接使用,同时预定义符号是在预处理期间处理的。 以下就是相关的预处理符号的作用。 二:#define定义常量 首先基本的语法是 #define name stuff 相对比较简单&#xff…

Ultraleap 3Di配置以及在 Unity 中使用 Ultraleap 3Di手部跟踪

0 开发需求 1、硬件:Ultraleap 手部追踪相机(Ultraleap 3Di) 2、软件:在计算机上安装Ultraleap Gemini (V5.2) 手部跟踪软件。 3、版本:Unity 2021 LTS 或更高版本 4、Unity XR插件管理:可从软件包管理器窗…

Bagging方法的基本思想

Bagging方法的基本思想实现 在Bagging集成当中,我们并行建立多个弱评估器(通常是决策树,也可以是其他非线性算法),并综合多个弱评估器的结果进行输出。当集成算法目标是回归任务时,集成算法的输出结果是弱…

乖乖,咱不用BeanUtil.copy了,咱试试这款神级工具(超详细)

引言 在现代Java应用程序开发中,处理对象之间的映射是一个常见而且必不可少的任务。随着项目规模的增长,手动编写繁琐的映射代码不仅耗时且容易出错,因此开发者们一直在寻找更高效的解决方案。比如基于Dozer封装的或者Spring自带的BeanUtil.…

AI Infra论文阅读之通过打表得到训练大模型的最佳并行配置

目录 0x0. 前言0x1. 摘要0x2. 介绍0x3. 背景0x4. 实验设置0x5. 高效的LLM训练分析0x5.1 Fused Kernels 和 Flash Attention0x5.1.1 Attention0x5.1.2 RMSNorm Kernel 0x5.2 Activation Checkpointing0x5.3 Micro-Batch 大小0x5.4 Tensor Parallelism和Pipline Parallelism0x5.5…