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.hqwc.cn/news/457292.html

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

相关文章

WebSocket基础详解

文章目录 前言由来简介优缺点适用场景兼容性 API介绍构造函数实例方法send()close() 实例属性ws.readyState(只读)ws.bufferedAmount(只读)ws.binaryTypeextensions(只读)protocol(只读&#xf…

算法笔记刷题日记——3.简单入门模拟 3.2 查找元素

刷题日记 3.2 查找元素 B1041 B1004 B1028 B1032 A1011 A1006 A1036 错题记录 B1028 人口普查 某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。 这里确保每个输入的日期都是合法的,但不一定是合理的…

蓝桥杯嵌入式学习记录——LCD的使用

目录 一、前言 二、LCD代码的移植 三、LCD代码的调用 一、前言 前一篇文章已经简单记录了一下cubeMX软件的使用和LED的点亮,今天来记录一下LCD的使用。LCD的驱动代码有很多,但实际上在蓝桥杯的比赛中用起来非常简单,因为赛点会提供LCD的驱…

mysq开启慢查询日志,对慢查询进行优化

1.创建实验的环境 创建对应的数据库,然后写脚本向数据库中写入400万条的数据 //创建实验用的数据库 CREATE DATABASE jsschool;//使用当前数据库 USE jsschool;//创建学生表 CREATE TABLE student (sno VARCHAR(20) PRIMARY KEY COMMENT 学生编号,sname VARCHAR(20…

微软为新闻编辑行业推出 AI 辅助项目,记者参加免费课程

2 月 6 日消息,微软当地时间 5 日发布新闻稿宣布与多家新闻机构展开多项基于生成式 AI 的合作。微软表示,其使命是确保新闻编辑室在今年和未来拥有创新。 目前建议企业通过微软官方合作伙伴获取服务,可以合规、稳定地提供企业用户使用ChatGP…

C#委托的前世今生

起因 很多C#初学者,都遇到过这样的问题——线程间操作无效,从不是创建控件的线程访问它。 今天就这个问题,展开分析。 溯源 先说下这个问题产生的根源。 大家都知道,程序运行起来之后,首先会有一个主线程&#xff…

用HTML5 + JavaScript实现下雪效果

用HTML5 JavaScript实现下雪效果 <canvas>是一个可以使用脚本 (通常为JavaScript) 来绘制图形的 HTML 元素。 <canvas> 标签/元素只是图形容器&#xff0c;必须使用脚本来绘制图形。 HTML5 canvas 图形标签基础https://blog.csdn.net/cnds123/article/details/…

搜索与图论(一)(深搜,广搜,树与图的存储遍历,拓扑排序)

一、DFS 往深里搜&#xff0c;搜到叶子结点那里&#xff0c;回溯&#xff0c;到可以继续到叶子结点深搜的位置。 1、回溯一定要恢复现场 2、定义一个与当前递归层数有关的终止条件&#xff08;题目要求的东西&#xff09; 3、每层都用循环判断是否存在可以dfs的路 输出数字…

DDoS攻击激增,分享高效可靠的DDoS防御方案

当下DDoS攻击规模不断突破上限&#xff0c;形成了 "网络威胁格局中令人不安的趋势"。专业数据显示&#xff0c;对比2022年上半年与2023年上半年&#xff0c;所有行业的DDoS攻击频率增加了314%。其中零售、电信和媒体公司遭受的攻击规模最大&#xff0c;三个垂直行业的…

10.0 Zookeeper 权限控制 ACL

zookeeper 的 ACL&#xff08;Access Control List&#xff0c;访问控制表&#xff09;权限在生产环境是特别重要的&#xff0c;所以本章节特别介绍一下。 ACL 权限可以针对节点设置相关读写等权限&#xff0c;保障数据安全性。 permissions 可以指定不同的权限范围及角色。 …

如何启动若依框架

Mysql安装 一、下载 链接&#xff1a;https://pan.baidu.com/s/1s8-Y1ooaRtwP9KnmP3rxlQ?pwd1234 提取码&#xff1a;1234 二、安装(解压) 下载完成后我们得到的是一个压缩包&#xff0c;将其解压&#xff0c;我们就可以得到MySQL 5.7.24的软件本体了(就是一个文件夹)&…

【Web - 框架 - Vue】随笔 - 通过`CDN`的方式使用`VUE 2.0`和`Element UI`

通过CDN的方式使用VUE 2.0和Element UI VUE 网址 https://cdn.bootcdn.net/ajax/libs/vue/2.7.16/vue.js源码 https://download.csdn.net/download/HIGK_365/88815507测试 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset&quo…