Unity 接口、抽象类、具体类对象的配合使用案例

文章目录

      • 示例1:接口(Interface)
      • 示例2:抽象类(Abstract Class)
      • 示例3:结合使用接口与抽象类
      • 示例4:多接口实现
      • 示例5:抽象类与接口结合

在Unity中使用C#编程时,接口、抽象类与具体类是面向对象设计中的重要概念。以下通过三个代码实例来讲解它们的设计与使用场景:

示例1:接口(Interface)

场景
假设我们正在开发一个游戏,需要定义一个“可移动”(IMovable)的接口,以便于所有角色、敌人和道具等都可以实现这个接口,从而具备移动的能力。

// 定义接口IMovable
public interface IMovable
{void Move(Vector3 direction);float Speed { get; set; }
}// 具体类Player实现IMovable接口
public class Player : MonoBehaviour, IMovable
{public float speed;public float Speed{get => speed;set => speed = value;}void Update(){if (Input.GetKey(KeyCode.W)){Move(Vector3.forward * Time.deltaTime * Speed);}}void Move(Vector3 direction){transform.position += direction;}
}// 同样,Enemy类也可以实现IMovable接口
public class Enemy : MonoBehaviour, IMovable
{// 实现Move方法和Speed属性...
}

示例2:抽象类(Abstract Class)

场景
考虑一个更为复杂的场景,我们有一个基础的实体基类,其中包含一些通用功能,同时希望某些实体具有攻击能力,但不直接提供具体的攻击逻辑,这时可以定义一个抽象的Actor类,并包含一个抽象的Attack方法。

// 抽象类Actor
public abstract class Actor : MonoBehaviour
{public int Health { get; protected set; }protected Actor(int initialHealth){Health = initialHealth;}// 抽象方法,由子类实现具体的攻击行为public abstract void Attack(Actor target);// 通用功能,例如显示血量public void DisplayHealthUI(){// 假设此处有UI更新代码}
}// 具体类Knight继承自Actor并实现Attack方法
public class Knight : Actor
{public Knight(int health) : base(health){}public override void Attack(Actor target){if (target is not null){target.Health -= 10; // 假设每次攻击造成10点伤害}}
}// 另一个具体类Mage同样继承自Actor并实现Attack方法
public class Mage : Actor
{public Mage(int health) : base(health){}public override void Attack(Actor target){if (target is not null){target.Health -= 20; // 假设每次攻击造成20点伤害}}
}

示例3:结合使用接口与抽象类

场景
假设我们的游戏包含不同类型的NPC,有些NPC会说话,有些则不会。我们可以先定义一个抽象的NPC类,然后用一个ISpeakable接口来表示那些能说话的NPC。

// 抽象类NPC
public abstract class NPC : MonoBehaviour
{public string Name { get; set; }public abstract void Interact();
}// ISpeakable接口
public interface ISpeakable
{string Speak();
}// 具体类Merchant继承自NPC并实现ISpeakable接口
public class Merchant : NPC, ISpeakable
{public Merchant(string name) {Name = name;}public override void Interact(){Debug.Log($"你与{Name}交谈...");if (this is ISpeakable speakable){Debug.Log(speakable.Speak());}}public string Speak(){return $"欢迎光临,我这里有各种商品出售!";}
}// 具体类Guard类也继承自NPC,但并不实现ISpeakable接口
public class Guard : NPC
{public Guard(string name) {Name = name;}public override void Interact(){Debug.Log($"你尝试与{Name}交谈,但他只是坚守岗位并未回应...");}
}

示例4:多接口实现

场景
在Unity中,我们可能需要设计一些对象既可以被玩家控制也可以被AI控制。这时可以定义IControllable(可控制)和IAIControlled(AI控制)两个接口。

// 定义可控制接口
public interface IControllable
{void TakePlayerInput();
}// 定义AI控制接口
public interface IAIControlled
{void UpdateAI();
}// 具体类Character同时实现两个接口
public class Character : MonoBehaviour, IControllable, IAIControlled
{public void TakePlayerInput(){// 处理玩家输入,例如移动、攻击等Debug.Log("处理玩家输入...");}public void UpdateAI(){// 更新AI逻辑,例如自动寻路、决策等Debug.Log("执行AI逻辑...");}void Update(){if (isPlayerControlled){TakePlayerInput();}else if (isAIControlled){UpdateAI();}}
}

在这个例子中,Character类可以根据游戏运行时的状态,选择使用玩家输入还是AI逻辑进行操作,体现了接口的灵活性和解耦性。

示例5:抽象类与接口结合

场景
考虑一个角色系统,角色分为基础角色和英雄角色,基础角色有基本属性如生命值和攻击力,而英雄角色除了基础属性外还有特殊技能。我们可以创建一个抽象角色类,并使用接口来表示具有特定技能的角色。

// 抽象角色类
public abstract class BaseCharacter : MonoBehaviour
{public int Health { get; protected set; }public int AttackPower { get; set; }protected BaseCharacter(int health, int attackPower){Health = health;AttackPower = attackPower;}// 基础攻击方法public virtual void Attack(BaseCharacter target){target.Health -= AttackPower;}
}// 特殊技能接口
public interface ISpecialAbility
{void UseSpecialAbility();
}// 英雄角色类继承自BaseCharacter并实现ISpecialAbility接口
public class Hero : BaseCharacter, ISpecialAbility
{public Hero(int health, int attackPower, string specialSkillDescription) : base(health, attackPower){SpecialSkillDescription = specialSkillDescription;}public string SpecialSkillDescription { get; private set; }// 实现特殊技能public override void Attack(BaseCharacter target){base.Attack(target);UseSpecialAbility();}public void UseSpecialAbility(){Debug.Log($"英雄施展{SpecialSkillDescription},对目标造成额外伤害...");}
}

这个示例展示了如何通过抽象类来封装共享的基础功能,并通过接口让某些具体类具备额外的能力,从而构建出丰富且灵活的角色系统。

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

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

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

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

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

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

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

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

相关文章

华为OD机试真题C卷-篇3

文章目录 查找一个有向网络的头节点和尾节点幼儿园篮球游戏 查找一个有向网络的头节点和尾节点 在一个有向图中,有向边用两个整数表示,第一个整数表示起始节点,第二个整数表示终止节点;图中只有一个头节点,一个或者多…

一、SSM 整合理解

本章概要 什么是 SSM 整合?SSM 整合核心问题明确 SSM 整合需要几个 IoC 容器?每个 IoC 容器对应哪些类型组件?IoC 容器之间关系和调用方向?具体多少配置类以及对应容器关系?IoC 初始化方式和配置位置? 1…

用甘特图有效管理多个项目进度

当公司或组织同时承担多个项目时,合理规划各项目的时间节点与资源分配对确保高效完成至关重要。采用甘特图可以直观地展示多个项目的时间进程、关键里程碑以及资源分配情况,便于从宏观层面全面把控各项目的动态。 在线甘特图软件 zz-plan.com 提供了非常强大的时间轴规划功能,支…

Xampp中Xdebug的安装使用

工欲善其事,必先利其器 XDebug简介 XDebug 是一个用于 PHP 的调试和性能分析工具。它提供了一系列功能,帮助开发者在开发和调试 PHP 应用程序时更加高效。 以下是 XDebug 的一些主要特性和功能: 调试功能: 断点调试:…

基础面试题整理7之Redis

1.redis持久化RDB、AOF RDB(Redis database) 在当前redis目录下生成一个dump.rdb文件,对redis数据进行备份 常用save、bgsave命令进行数据备份: save命令会阻塞其他redis命令,不会消耗额外的内存,与IO线程同步;bgsav…

MySql索引分类

目录 第一章、按数据结构分类1.1)树型数据结构索引1.2)Hash数据结构索引1.3) 其他数据结构索引 第二章、按物理存储方式分类2.1)聚簇索引(聚集索引)2.2)非聚簇索引(非聚集索引&#…

Blender教程(基础)-顶点的移动、滑移-16

一、顶点的移动与缩放 ShiftA新建柱体、切换到编辑模式 点模式下,选择一个顶点、选择移动(GZ),发现顶点严Z轴移动,如下图所示 GY 按数字键盘7切换视图,选择这个面的所有顶点 按S把面缩放大 Ctrl…

【大模型上下文长度扩展】FlashAttention-2:比1代加速1.29倍、GPU利用率从55%上升到72%

FlashAttention-2 提出背景FlashAttention-2 改进 前向传播和反向传播对比FlashAttention前向传播FlashAttention反向传播FlashAttention-2前向传播FlashAttention-2反向传播FlashAttention-2并行性线程束之间的工作分区 总结FlashAttentionFlashAttention-2 论文:h…

Typora导出html文件图片自动转换成base64

Typora导出html文件图片自动转换成base64 一、出现问题二、解决方案三、编码实现3.1.创建Java项目3.2.代码3.3.打包成Jar包 四、如何使用endl 一、出现问题 typora 导出 html 的时候必须带有原图片,不方便交流学习,文件太多显得冗余,只有将图…

Golang GC 介绍

文章目录 0.前言1.发展史2.并发三色标记清除和混合写屏障2.1 三色标记2.2 并发标记问题2.3 屏障机制Dijkstra 插入写屏障Yuasa 删除写屏障混合写屏障 3.GC 过程4.GC 触发时机5.哪里记录了对象的三色状态?6.如何观察 GC?方式1:GODEBUGgctrace1…

鸿蒙OS导入项目报错不能运行 @ohos\hvigor\bin\hvigor.js‘

在自学HarmonyOS时,想在DevEco Studio导入官方示例代码:待办列表(ArkTS)报错 C:\Users\woods\Downloads\test01\ToDoListArkTS\node_modules\ohos\hvigor\bin\hvigor.js --mode module -p moduleentrydefault -p productdefault …

开源软件:引领技术创新、商业模式与安全的融合

序 在信息技术日新月异的今天,开源软件以其独特的魅力和影响力,正逐渐成为软件产业的新常态。开源软件的低成本、高度可协作性和透明度等特点,不仅吸引了无数企业和个人用户的青睐,更为软件行业带来了前所未有的繁荣景象。 一、…

【C++】构造函数、初始化列表,析构函数,拷贝构造函数,运算符重载

注:本博客图片来源于学习笔记: 学习笔记https://gitee.com/box-he-he/learning-notes 完整思维导图请前往该博主码云下载。 目录 注:本博客图片来源于学习笔记: 学习笔记https://gitee.com/box-he-he/learning-notes 完整思维导图请前往该博主码云下载…

微信小程序(三十六)事件传参

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.传参步骤 2.传参接收解构步骤 源码&#xff1a; index.wxml <button type"primary" bind:tap"onclick" mark:index"{{0}}" mark:remb"{{1}}" class"But&quo…

我的QQ编程学习群

欢迎大家加入我的QQ编程学习群。 群号:950365002 群里面有许多的大学生大佬&#xff0c;有编程上的疑惑可以随时问&#xff0c;也可以聊一些休闲的东西。 热烈欢迎大家加入&#xff01;&#xff01; 上限:150人。

华视 CVR-100UC 身份证读取 html二次开发模板

python读卡&#xff1a;python读卡 最近小唐应要求要开发一个前端的身份证读卡界面&#xff0c;结果华视CVR-100UC 的读取界面是在是有点&#xff0c;而且怎么调试连官方最基本的启动程序都执行不了。CertReader.ocx 已成功&#xff0c;后面在问询一系列前辈之后&#xff0c;大…

uniapp 使用renderjs引入echarts

效果图&#xff1a; 1.1renderjs引入echarts 组件zmui-echarts.vue&#xff1a; <template><view class"zmui-echarts" :prop"option" :change:prop"echarts.delay"></view> </template><script>export defaul…

时序预测 | Matlab实现基于LSTM长短期记忆神经网络的电力负荷预测模型

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 时序预测 | Matlab实现基于LSTM长短期记忆神经网络的电力负荷预测模型 LSTM(长短期记忆)是一种递归神经网络(RNN)的变体,它在序列数据建模方面表现出色。电力负荷预测是一项重要的任务,可以利用LSTM神经网络…

【华为 ICT HCIA eNSP 习题汇总】——题目集13

1、以下在项目规划阶段中需要完成的工作是&#xff08;&#xff09;。 A、确定技术方案 B、了解项目背景 C、选择网络产品 D、规划 IP 地址 考点&#xff1a;网络规划与设计 解析&#xff1a;&#xff08;B&#xff09; 确定技术方案是在网络规划的设计阶段完成的工作&#xff…

vue - 指令(一)

看文章可以得到什么&#xff1f; 1.可以快速的了解并会使用vue的指令 2.可以加深你对vue指令的理解&#xff0c;知道每个指令代表什么功能​​​​​​​ 目录 什么是vue的指令&#xff1f;​​​​​​​ vue常见指令的使用 v-html v-show v-if v-else 和v-else-…