用Unity实现AR类炉石传说游戏——开发框架(一)

原创 2018年04月16日 20:32:06

游戏流程图

这里写图片描述


玩家类

每场对战中有两个玩家实例

每个玩家拥有:

  1. 卡组
  2. 牌库
  3. 手牌
  4. 场上的英雄
  5. 生命值,能量值等属性

卡组

vector作为容器存储

vector<Card> CardsCombination;

由玩家自行组合


牌库

使用栈来作为容器,在对局开始时,用洗乱的玩家卡组作为玩家的牌库

stack<Card> CardsStack;

玩家与牌库的交互:

  1. 每个玩家回合开始时,取出牌库顶端的若干张牌放入玩家的手牌中。
  2. 若玩家触发丢弃/获得手牌的效果,依据效果丢弃/获得手牌

手牌

因为需要频繁增删,使用List作为容器存储

List<Card> CardsInHand;

玩家与手牌交互:玩家使用卡牌,根据卡牌类型(效果牌、英雄牌)来决定使用方式

  1. 若是英雄牌:生成英雄实例,并push_back到玩家的Heroes容器中
  2. 若是效果牌:直接造成效果

场上的英雄:

同样地,频繁增删,使用List容器来存储玩家场上的英雄

List<Hero> Heroes(10);

这个容器应实现自动移位:如当前有5个英雄,分别存储在Heroes[0……4]中,英雄Heroes[2]阵亡后,3,4应自动前移;
这里写图片描述
场景中对应的变化是:
这里写图片描述
ps:数字表示英雄存在于场上的槽位,英雄死亡后,在容器中的位置处于死亡英雄后的那些英雄都应向左移一个槽位。此例中,皇子和盖伦都会向左走一个槽位(需要动画)


生命值,能量值等属性

int类型

注意对属性值的修改操作要使用一个public的函数,而不应该直接用运算符更改,并做保证不超过上限/下限的处理

能量

  1. 初始值为1
  2. 使用卡牌时消耗
  3. 通过卡牌效果获得能量

能量上限

  1. 初始值为1
  2. 每个回合增加一点上限
  3. 通过卡牌效果增加上限

生命值

  1. 初始值为30
  2. 受到敌方伤害时减少
  3. 通过卡牌效果增加或减少

玩家类总结

using System;
using System.Collections.Generic;

public class Player
{
    /// <summary>
    /// 当前生命值
    /// </summary>
    private int HP;

    /// <summary>
    /// 当前能量值
    /// </summary>
    private int MP;

    /// <summary>
    /// 最大生命值
    /// </summary>
    private int MaxHP;

    /// <summary>
    /// 最大能量值
    /// </summary>
    private int MaxMP;

    /// <summary>
    /// 卡组,由玩家在对局外自行组合
    /// </summary>
    private List<Card> CardsCombination;

    /// <summary>
    /// 牌库,对局开始时打乱卡组获得
    /// </summary>
    private Stack<Card> CardStack;

    /// <summary>
    /// 手牌,玩家从牌库中获得
    /// </summary>
    private LinkedList<Card> CardsInHand;

    /// <summary>
    /// 场上的英雄,玩家召唤而来
    /// </summary>
    private LinkedList<Hero> HeroesOnCourt;


    Player();

    /// <summary>
    /// 使用卡牌,根据卡牌类型不同决定是召唤英雄还是施展卡牌效果,使用后卡牌从手牌中删去
    /// </summary>
    /// <param name="card">使用的那一张卡牌</param>
    public void UseCard(Card card);

    /// <summary>
    /// 玩家召唤英雄,召唤后英雄加入HeroesOnCourt中,并出现在场上
    /// 英雄的获取通过调用card.InitHero();
    /// </summary>
    /// <param name="hero">召唤的英雄</param>
    public void SummonHero(Hero hero);

    /// <summary>
    /// 玩家结束回合,导演进行回合结算后,将出牌权转移给另一玩家
    /// </summary>
    public void EndTurn();

    /// <summary>
    /// 修改玩家当前HP,注意不能溢出上下界,返回是否修改成功
    /// </summary>
    /// <param name="hp">正数则增,负数则减</param>
    /// <returns></returns>
    public bool AlterHP(int hp);

    /// <summary>
    /// 修改玩家当前MP,注意不能溢出上下界,返回是否修改成功
    /// </summary>
    /// <param name="mp">正数则增,负数则减</param>
    /// <returns></returns>
    public bool AlterMP(int mp);

    /// <summary>
    /// 判断玩家当前MP是否大于mp
    /// </summary>
    /// <param name="mp"></param>
    /// <returns></returns>
    public bool EnoughMP(int mp);

    /// <summary>
    /// 玩家从牌库栈顶获得牌,加入手牌中
    /// </summary>
    public void DrawCard();

    /// <summary>
    /// 玩家认输
    /// </summary>
    /// <returns>投降成功/失败</returns>
    public bool Yield();

    /// <summary>
    /// 将手牌弃至牌库
    /// </summary>
    /// <param name="card">要丢弃的卡牌</param>
    /// <returns>弃牌成功/失败</returns>
    public bool DropCard(Card card);

    /// <summary>
    /// 指挥英雄attacker攻击英雄目标target
    /// </summary>
    /// <param name="Attacker">攻击英雄</param>
    /// <param name="target">受击英雄</param>
    /// <returns></returns>
    public bool CommandHeroAttackHero(Hero Attacker, Hero target);

    /// <summary>
    /// 指挥英雄attacker攻击玩家目标target
    /// </summary>
    /// <param name="Attacker">攻击英雄</param>
    /// <param name="target">受击玩家</param>
    /// <returns></returns>
    public bool CommandHeroAttackPlayer(Hero Attacker, Player target);

    /// <summary>
    /// 将效果施用在英雄目标上
    /// </summary>
    /// <param name="target">英雄目标</param>
    /// <returns></returns>
    public bool CastEffectOnTarget(Hero target);

    /// <summary>
    /// 将效果施用在玩家目标上
    /// </summary>
    /// <param name="target">玩家目标</param>
    /// <returns></returns>
    public bool CastEffectOnTarget(Player target);
}

每个玩家打开游戏时便有一个一直存在的玩家实例,主要是为了存储玩家的自定义卡组。
在“对局开始”事件触发时,应对玩家属性进行一定的设定,如补满生命;初始化能量及上限;随机生成牌库;清空手牌,场上英雄等操作。


卡牌类

using System;
using System.Collections.Generic;

public class Card
{
    /// <summary>
    /// 卡牌名称
    /// </summary>
    private string Name;

    /// <summary>
    /// 卡牌类型:英雄牌/效果牌
    /// </summary>
    private int CardType;

    /// <summary>
    /// 卡牌耗费
    /// </summary>
    private int Cost;

    /// <summary>
    /// 效果牌专有:卡牌效果
    /// </summary>
    private Effect effect;

    /// <summary>
    /// 英雄牌专有:英雄血量
    /// </summary>
    private int HeroHP;

    /// <summary>
    /// 英雄牌专有:英雄伤害
    /// </summary>
    private int HeroDamage;

    /// <summary>
    /// 英雄牌专有:英雄效果
    /// </summary>
    private Effect HeroEffect;

    /// <summary>
    /// 施展效果,通过effect.CastEffect()实现
    /// </summary>
    public void CastEffect();

    /// <summary>
    /// 根据卡牌属性生成一个英雄实例并返回
    /// </summary>
    /// <returns>英雄实例,用于被玩家召唤</returns>
    public Hero InitHero();

}

英雄类

using System;
using System.Numerics;

public class Hero
{
    /// <summary>
    /// 英雄的位置
    /// </summary>
    private Vector3 Pos;

    /// <summary>
    /// 当前生命值
    /// </summary>
    private int HP;

    /// <summary>
    /// 当前攻击力
    /// </summary>
    private int Damage;

    /// <summary>
    /// 最大生命值
    /// </summary>
    private int MaxHP;

    /// <summary>
    /// 英雄名字
    /// </summary>
    private string Name;

    /// <summary>
    /// 英雄特效
    /// </summary>
    private Effect HeroEffect;

    /// <summary>
    /// 本回合可攻击次数,每回合重置
    /// </summary>
    private int AttackCount;


    /// <summary>
    /// 每回合最大可攻击次数,固有属性/通过特效改变
    /// </summary>
    private int MaxAttackCount;

    /// <summary>
    /// 施展英雄特效,通过HeroEffect.CastEffect()实现
    /// </summary>
    public void CastEffect();

    /// <summary>
    /// 攻击目标英雄
    /// </summary>
    /// <param name="target">攻击目标</param>
    public void Attack(Hero target);

    /// <summary>
    /// 攻击目标玩家
    /// </summary>
    /// <param name="target">攻击目标</param>
    public void Attack(Player target);


}

效果类

using System;

public class Effect
{
    private string Name;

    public virtual void CastEffect();

    public virtual void CastEffectOnHero(Hero target);

    public virtual void CastEffectOnPlayer(Player
}

UML图

这里写图片描述

Unity3d笔记:炉石传说中的功能实现解析

播放片头动画:在void OnGUI()中用GUI.DrawTexture()方法显示视频,用GUI.Label()显示提示;Start()中使用MovieTexture().Play()方法播放视频...
  • fengye2two
  • fengye2two
  • 2017-05-26 14:10:18
  • 560

Unity游戏开发日记-炉石传说之卡牌切换效果实现

如何控制一张卡牌的随机切换,答案是只需要在固定时间,更改他的UI Sprite的spriteName即可。 step:1.先把所有名字存到数组中 2.取得生成卡牌的UI...
  • a58425298
  • a58425298
  • 2017-08-05 21:07:08
  • 1108

《炉石传说》架构设计赏析(1):游戏启动流程

前些天看新闻,Unity Awards两项大奖颁给了暴雪的《炉石传说》,这真是对Unity一个再好不过的宣传了——你看,暴雪都开始用Unity了。大家都知道,目前Unity发布的游戏大多都没有对程序集...
  • Neil3D
  • Neil3D
  • 2018-04-05 17:41:04
  • 36952

unity开发炉石传说系列卡牌生成代码部分代码

using UnityEngine; using System.Collections; using System.Collections.Generic; //生成卡牌 public class ...
  • alayeshi
  • alayeshi
  • 2015-01-06 10:34:18
  • 1330

UGUI 类炉石传说箭头效果实现

一.目标效果之前在网上搜索过如何实现炉石箭头效果,但是并没有得到靠谱的答案,更别说完整的Demo了。 后来仔细观察了一下箭头的效果,箭头的身体是不断向前流动的,箭头的头部以及尾部接近透明,应该是设计...
  • qq_26276097
  • qq_26276097
  • 2017-07-20 01:16:49
  • 933

#游戏unity#AR中奇妙的虚拟按钮

#游戏unity#AR中奇妙的虚拟按钮先说点题外话,博主在调试项目的时候,什么设置也没有改,突然就运行保存,说vuforia的实例没有初始化,去网上也没有查到错误原因,吓的博主去脚本里找了好久qwq后...
  • zys91011_muse
  • zys91011_muse
  • 2017-05-19 13:15:46
  • 1342

CCF 201612-3 炉石传说 JAVA实现

炉石传说 问题描述   《炉石传说:魔兽英雄传》(Hearthstone: Heroes of Warcraft,简称炉石传说)是暴雪娱乐开发的一款集换式卡牌游戏(如下图所示)。游戏在...
  • oxygen_czp
  • oxygen_czp
  • 2016-10-20 14:37:12
  • 1264

U3D-炉石传说全套资源+源码+百度网盘

  • 2016年01月18日 22:36
  • 48B
  • 下载

【推荐课程】Unity3D-游戏ARVR进阶课程 - 动画系统

【推荐课程】Unity3D-游戏ARVR进阶课程 - 动画系统
  • sinat_35761779
  • sinat_35761779
  • 2016-11-24 15:09:43
  • 802
收藏助手
不良信息举报
您举报文章:用Unity实现AR类炉石传说游戏——开发框架(一)
举报原因:
原因补充:

(最多只允许输入30个字)