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

相关文章

MySQL的配置文件详解及实例代码

《MySQL的配置文件详解及实例代码》MySQL的配置文件是服务器运行的重要组成部分,用于设置服务器操作的各种参数,下面:本文主要介绍MySQL配置文件的相关资料,文中通过代码介绍的非常详细,需要... 目录前言一、配置文件结构1.[mysqld]2.[client]3.[mysql]4.[mysqldum

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

C#和Unity中的中介者模式使用方式

《C#和Unity中的中介者模式使用方式》中介者模式通过中介者封装对象交互,降低耦合度,集中控制逻辑,适用于复杂系统组件交互场景,C#中可用事件、委托或MediatR实现,提升可维护性与灵活性... 目录C#中的中介者模式详解一、中介者模式的基本概念1. 定义2. 组成要素3. 模式结构二、中介者模式的特点

Java Stream流以及常用方法操作实例

《JavaStream流以及常用方法操作实例》Stream是对Java中集合的一种增强方式,使用它可以将集合的处理过程变得更加简洁、高效和易读,:本文主要介绍JavaStream流以及常用方法... 目录一、Stream流是什么?二、stream的操作2.1、stream流创建2.2、stream的使用2.

springboot项目中集成shiro+jwt完整实例代码

《springboot项目中集成shiro+jwt完整实例代码》本文详细介绍如何在项目中集成Shiro和JWT,实现用户登录校验、token携带及接口权限管理,涉及自定义Realm、ModularRe... 目录简介目的需要的jar集成过程1.配置shiro2.创建自定义Realm2.1 LoginReal

Python跨文件实例化、跨文件调用及导入库示例代码

《Python跨文件实例化、跨文件调用及导入库示例代码》在Python开发过程中,经常会遇到需要在一个工程中调用另一个工程的Python文件的情况,:本文主要介绍Python跨文件实例化、跨文件调... 目录1. 核心对比表格(完整汇总)1.1 自定义模块跨文件调用汇总表1.2 第三方库使用汇总表1.3 导

MySQL多实例管理如何在一台主机上运行多个mysql

《MySQL多实例管理如何在一台主机上运行多个mysql》文章详解了在Linux主机上通过二进制方式安装MySQL多实例的步骤,涵盖端口配置、数据目录准备、初始化与启动流程,以及排错方法,适用于构建读... 目录一、什么是mysql多实例二、二进制方式安装MySQL1.获取二进制代码包2.安装基础依赖3.清

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

Apache Ignite缓存基本操作实例详解

《ApacheIgnite缓存基本操作实例详解》文章介绍了ApacheIgnite中IgniteCache的基本操作,涵盖缓存获取、动态创建、销毁、原子及条件更新、异步执行,强调线程池注意事项,避免... 目录一、获取缓存实例(Getting an Instance of a Cache)示例代码:二、动态

JSONArray在Java中的应用操作实例

《JSONArray在Java中的应用操作实例》JSONArray是org.json库用于处理JSON数组的类,可将Java对象(Map/List)转换为JSON格式,提供增删改查等操作,适用于前后端... 目录1. jsONArray定义与功能1.1 JSONArray概念阐释1.1.1 什么是JSONA