回合制游戏介绍
回合制游戏属于一种游戏玩法,其中玩家和敌对势力轮流进行行动,每个行动都必须在一个"回合"内完成。在每个回合内,玩家可以执行特定的动作,如攻击、防御、使用技能或物品等。可以设置相应动作的实现要求,执行的先后顺序等,战斗先后顺序常见以速度优先。然后敌对势力会采取行动,如攻击玩家、施放法术等。游戏通常通过回合制系统来管理行动顺序和游戏进程。所有玩家执行操作完为一回合,一般会有回合数限制,否则可能出现双方没有分出胜负而持续战斗的情况。
回合制游戏类型
下面是一些常见的类型:
-
角色扮演游戏(RPG):这是回合制游戏的主要类型之一。玩家在游戏中扮演一个角色,通常是一个英雄或冒险者。玩家通过回合制的战斗系统与敌人战斗,并在战斗过程中提升角色的属性和技能。
-
战略游戏:这种类型的游戏强调玩家对战斗的策略性决策。玩家需要在回合内制定战略和计划,例如部署队伍、选择攻击目标、使用特殊能力等。这类游戏通常以回合制战斗为核心,但也可以包含其他元素,如资源管理和领地扩展等。
-
卡牌游戏:在这类游戏中,玩家使用一副自己组建的卡牌扑克牌组来进行回合制对战。每张卡牌都代表不同的角色、法术或技能,玩家需要在回合内选择合适的卡牌来应对对手的行动,并争取取得胜利。
-
战斗游戏:这种类型的回合制游戏主要关注战斗和格斗动作。玩家需要在每个回合内选择攻击的类型、目标和方式,以最大限度地伤害敌人或保护自己。这类游戏通常强调战斗的策略性和技巧性。
回合制战斗游戏实例
搭建场景:分别有玩家和敌人两个对象
本实例回合机制:玩家先手攻击敌方,等所有玩家攻击之后,敌方开始轮流攻击玩家,当双方所有角色死亡时另一方胜利,这就属于一个回合。本实例只是为了实现回合制最简单的一种。当然还可以设置速度优先,哪个角色速度最高就先攻击。
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);
else
gm.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.本实例只是模拟实现回合制游戏的战斗回合机制,后续添加以速度值大小判断哪个角色先手攻击,以及一些战斗特效,攻击力,前排后排等,会写一个详细策划