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

相关文章

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

springboot security验证码的登录实例

《springbootsecurity验证码的登录实例》:本文主要介绍springbootsecurity验证码的登录实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录前言代码示例引入依赖定义验证码生成器定义获取验证码及认证接口测试获取验证码登录总结前言在spring

tomcat多实例部署的项目实践

《tomcat多实例部署的项目实践》Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,本文主要介绍了tomcat多实例部署的项目实践,具有一定的参考价值,感兴趣的可... 目录1.创建项目目录,测试文China编程件2js.创建实例的安装目录3.准备实例的配置文件4.编辑实例的

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

Spring 中使用反射创建 Bean 实例的几种方式

《Spring中使用反射创建Bean实例的几种方式》文章介绍了在Spring框架中如何使用反射来创建Bean实例,包括使用Class.newInstance()、Constructor.newI... 目录1. 使用 Class.newInstance() (仅限无参构造函数):2. 使用 Construc

MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析

《MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析》本文将详细讲解MyBatis-Plus中的lambdaUpdate用法,并提供丰富的案例来帮助读者更好地理解和应... 目录深入探索MyBATis-Plus中Service接口的lambdaUpdate用法及示例案例背景

MyBatis-Plus中静态工具Db的多种用法及实例分析

《MyBatis-Plus中静态工具Db的多种用法及实例分析》本文将详细讲解MyBatis-Plus中静态工具Db的各种用法,并结合具体案例进行演示和说明,具有很好的参考价值,希望对大家有所帮助,如有... 目录MyBATis-Plus中静态工具Db的多种用法及实例案例背景使用静态工具Db进行数据库操作插入

Spring中@Lazy注解的使用技巧与实例解析

《Spring中@Lazy注解的使用技巧与实例解析》@Lazy注解在Spring框架中用于延迟Bean的初始化,优化应用启动性能,它不仅适用于@Bean和@Component,还可以用于注入点,通过将... 目录一、@Lazy注解的作用(一)延迟Bean的初始化(二)与@Autowired结合使用二、实例解

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

mysqld_multi在Linux服务器上运行多个MySQL实例

《mysqld_multi在Linux服务器上运行多个MySQL实例》在Linux系统上使用mysqld_multi来启动和管理多个MySQL实例是一种常见的做法,这种方式允许你在同一台机器上运行多个... 目录1. 安装mysql2. 配置文件示例配置文件3. 创建数据目录4. 启动和管理实例启动所有实例