Unity回合制小游戏小实例

2023-11-22 23:21

本文主要是介绍Unity回合制小游戏小实例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

回合制游戏介绍

回合制游戏属于一种游戏玩法,其中玩家和敌对势力轮流进行行动,每个行动都必须在一个"回合"内完成。在每个回合内,玩家可以执行特定的动作,如攻击、防御、使用技能或物品等。可以设置相应动作的实现要求,执行的先后顺序等,战斗先后顺序常见以速度优先。然后敌对势力会采取行动,如攻击玩家、施放法术等。游戏通常通过回合制系统来管理行动顺序和游戏进程。所有玩家执行操作完为一回合,一般会有回合数限制,否则可能出现双方没有分出胜负而持续战斗的情况。

回合制游戏类型

下面是一些常见的类型:

  1. 角色扮演游戏(RPG):这是回合制游戏的主要类型之一。玩家在游戏中扮演一个角色,通常是一个英雄或冒险者。玩家通过回合制的战斗系统与敌人战斗,并在战斗过程中提升角色的属性和技能。

  2. 战略游戏:这种类型的游戏强调玩家对战斗的策略性决策。玩家需要在回合内制定战略和计划,例如部署队伍、选择攻击目标、使用特殊能力等。这类游戏通常以回合制战斗为核心,但也可以包含其他元素,如资源管理和领地扩展等。

  3. 卡牌游戏:在这类游戏中,玩家使用一副自己组建的卡牌扑克牌组来进行回合制对战。每张卡牌都代表不同的角色、法术或技能,玩家需要在回合内选择合适的卡牌来应对对手的行动,并争取取得胜利。

  4. 战斗游戏:这种类型的回合制游戏主要关注战斗和格斗动作。玩家需要在每个回合内选择攻击的类型、目标和方式,以最大限度地伤害敌人或保护自己。这类游戏通常强调战斗的策略性和技巧性。

回合制战斗游戏实例

搭建场景:分别有玩家和敌人两个对象

 本实例回合机制:玩家先手攻击敌方,等所有玩家攻击之后,敌方开始轮流攻击玩家,当双方所有角色死亡时另一方胜利,这就属于一个回合。本实例只是为了实现回合制最简单的一种。当然还可以设置速度优先,哪个角色速度最高就先攻击。

BaseObj:共性方法基类

抽象移动方法,伤害方法

using UnityEngine;//共性方法基类
public abstract class BaseObj : MonoBehaviour
{protected abstract void MoveTo(Vector3 go, float dis);//移动方法protected abstract void Damage(int damage);//伤害方法private void Start(){}private void Update(){}
}

 ObjectControl类

继承BaseObj,主要实现了移动,攻击,返回,队伍切换等

每一个角色都需要该脚本

using UnityEngine;public class ObjectControl : BaseObj
{private Vector3 primitivePos;//原始位置private Vector3 primitiveRot;//原始旋转private Vector3 tempPos;//临时变量private bool canMove;//限制是否可以移动public int hp = 100;//血量private Vector3 targetPos;private float distance;private GameManage gm;public bool GetMove{set { canMove = value; }get { return canMove; }}private void Start(){distance = 1;canMove = false;primitivePos = transform.position;//保存当前物体位置primitiveRot = transform.eulerAngles;//保存当前物体旋转tempPos = Vector3.zero;//赋值targetPos = Vector3.zero;gm = GameObject.Find("GameManage").GetComponent<GameManage>();}private void Update(){if (canMove){MoveTo(targetPos, distance);}}protected override void Damage(int damage){if (hp > 0){hp -= damage;if (hp <= 0){Debug.Log("死亡");hp = 0;if (gameObject.tag == "Player")gm.GetPlayer.Remove(gameObject);elsegm.GetEnemy.Remove(gameObject);Destroy(gameObject);}else{Debug.Log("受伤");}}}protected override void MoveTo(Vector3 go, float dis){if (Vector3.Distance(transform.position, go) > dis){tempPos = go;//让临时变量和看向的角色等高tempPos.y = transform.position.y;//等高transform.LookAt(tempPos);//看向攻击方transform.Translate(Vector3.forward * Time.deltaTime * 5);//移动}else{canMove = false;if (dis > 0.1f){//攻击Attack();//返回阶段的参数变化GoBackParameter();}else{//返回到原始位置GoBack();ChangeNext();}}}private void Attack()//攻击{if (gm.go != null){gm.go.GetComponent<ObjectControl>().Damage(50);}}private void GoBack(){transform.position = primitivePos;transform.eulerAngles = primitiveRot;canMove = false;}private void GoBackParameter() //返回的参数{canMove = true;targetPos = primitivePos;distance = 0.1f;}private void ChangeNext()//同队切换角色进行攻击{if (gm.GetIndex < gm.GetTeam.Count - 1){gm.GetIndex++;distance = 1;gm.Announce(gm.go);}else//换队伍{ChangeTeam();}}private void Action(GameObject go){targetPos = go.transform.position;}private void ChangeTeam(){gm.GetIndex = 0;distance = 1;if (gm.GetTeam == gm.GetPlayer){gm.GetTeam = gm.GetEnemy;gm.go = gm.GetPlayer[0];}else{gm.GetTeam = gm.GetPlayer;gm.go = gm.GetEnemy[0];}gm.Announce(gm.go);}
}

GameManage管理类

使用两个GameObject型列表List分别存储players和enemys,建立GameObject型管理当前是哪一队在操作。该类中设置player先攻击,胜利条件等

需要在场景中建立一个空物体,将该脚本拖入。

注意每个角色都需要设置好标签,Cube为Player,Sphere为enemy

 

using System.Collections.Generic;
using UnityEngine;//管理类
public class GameManage : MonoBehaviour
{//获取游戏对象private GameObject[] players;private GameObject[] enemys;private List<GameObject> player;private List<GameObject> enemy;private List<GameObject> team;//当前是哪一队在操作private int index;public GameObject go;//攻击目标public List<GameObject> GetPlayer{set { player = value; }get { return player; }}public List<GameObject> GetEnemy{set { enemy = value; }get { return enemy; }}public List<GameObject> GetTeam{set { team = value; }get { return team; }}public int GetIndex{set { index = value; }get { return index; }}private void Awake(){players = GameObject.FindGameObjectsWithTag("Player");enemys = GameObject.FindGameObjectsWithTag("enemy");player = new List<GameObject>();enemy = new List<GameObject>();foreach (var o in players){player.Add(o);}foreach (var o in enemys){enemy.Add(o);}team = player;//player先攻击index = 0;}private void Start(){go = enemy[0];Announce(go);}private void Update(){}public void Announce(GameObject go)//发布命令{if (team.Count == 0){if (player.Count == 0) { Debug.Log("Sphere战胜,cube战败"); }else{ Debug.Log("cube战胜,Sphere战败"); }return;//结束,可以设置切换场景,暂停等}team[index].SendMessage("Action", go, SendMessageOptions.DontRequireReceiver);team[index].GetComponent<ObjectControl>().GetMove = true;}
}

实例结果展示

回合制

总结

1.本实例有个问题,每次攻击敌方死亡后,没有更新后续方块攻击目标的位置,因此后续方块依旧会攻击已经死亡后的球体的位置,而不会去攻击下一个存活的球体。解决办法:攻击后判断该球是否死亡,死亡则将攻击目标位置更新为敌方List中的下一个物体位置。

2.本实例只是模拟实现回合制游戏的战斗回合机制,后续添加以速度值大小判断哪个角色先手攻击,以及一些战斗特效,攻击力,前排后排等,会写一个详细策划

学习参考:03-角色的移动原理实现_batch_哔哩哔哩_bilibili

这篇关于Unity回合制小游戏小实例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/413666

相关文章

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

MySQL的索引失效的原因实例及解决方案

《MySQL的索引失效的原因实例及解决方案》这篇文章主要讨论了MySQL索引失效的常见原因及其解决方案,它涵盖了数据类型不匹配、隐式转换、函数或表达式、范围查询、LIKE查询、OR条件、全表扫描、索引... 目录1. 数据类型不匹配2. 隐式转换3. 函数或表达式4. 范围查询之后的列5. like 查询6

Python开发围棋游戏的实例代码(实现全部功能)

《Python开发围棋游戏的实例代码(实现全部功能)》围棋是一种古老而复杂的策略棋类游戏,起源于中国,已有超过2500年的历史,本文介绍了如何用Python开发一个简单的围棋游戏,实例代码涵盖了游戏的... 目录1. 围棋游戏概述1.1 游戏规则1.2 游戏设计思路2. 环境准备3. 创建棋盘3.1 棋盘类

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

实例:如何统计当前主机的连接状态和连接数

统计当前主机的连接状态和连接数 在 Linux 中,可使用 ss 命令来查看主机的网络连接状态。以下是统计当前主机连接状态和连接主机数量的具体操作。 1. 统计当前主机的连接状态 使用 ss 命令结合 grep、cut、sort 和 uniq 命令来统计当前主机的 TCP 连接状态。 ss -nta | grep -v '^State' | cut -d " " -f 1 | sort |

Java Websocket实例【服务端与客户端实现全双工通讯】

Java Websocket实例【服务端与客户端实现全双工通讯】 现很多网站为了实现即时通讯,所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发 出HTTP request,然后由服务器返回最新的数据给客服端的浏览器。这种传统的HTTP request 的模式带来很明显的缺点 – 浏 览器需要不断的向服务器发出请求,然而HTTP