Unity回合制小游戏小实例

编程入门 行业动态 更新时间:2024-10-09 03:21:28

Unity回合制<a href=https://www.elefans.com/category/jswz/34/1769974.html style=小游戏小实例"/>

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回合制小游戏小实例

本文发布于:2024-02-07 12:13:30,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1756983.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:小游戏   实例   Unity

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!