Unity回合制卡牌游戏开发示例

需积分: 39 22 下载量 168 浏览量 更新于2024-12-04 3 收藏 3.31MB 7Z 举报
资源摘要信息:"Unity 回合制卡牌demo是一个基于Unity引擎开发的2D回合制卡牌游戏的示例项目。它展示了如何构建基本的回合逻辑以及项目框架,并且使用了C#语言进行编程。该demo的源代码中定义了一个Fighter类,该类负责管理战斗中角色的基本属性和行为。Fighter类主要用到了Unity的GameObject类、Transform组件以及其他Unity API进行游戏对象的创建、管理和交互。 Fighter类中定义了三个公共的GameObject成员变量objPic、objHp和objMp,它们分别用于存储角色的图片、生命值条和魔法值条的游戏对象实例。这些实例在游戏中通常被用来向玩家展示角色的当前状态,例如剩余的生命值和魔法值。 Fighter类还包含了一个字符串类型的私有变量id,以及与之对应的公共方法setId和getId。id变量用于唯一标识一个Fighter对象,并且通过getId和setId方法来获取和设置该标识。如果id为null,说明该Fighter对象没有被正确地初始化或者设置,因此会通过setActive(false)方法来禁用该游戏对象,使其不被游戏逻辑处理。 在Fighter类中,还有一段注释掉的代码,这些代码原本可能是用于根据id值获取相应的纹理资源,并将其设置为角色的纹理,如果获取失败则同样禁用该游戏对象。这表明该Fighter对象还可能与角色的图像展示有关。 该示例项目使用了Unity的命名空间using UnityEngine;和using System.Collections;,这表明它依赖于Unity的基本游戏框架,以及标准的集合类。 从【标签】可以看出,这个项目是围绕Unity引擎,特别是针对Unity2D游戏开发。Unity2D是指使用Unity引擎开发的二维游戏,与Unity3D相对,3D游戏更侧重于空间和体积的处理。项目标签中的“回合制卡牌”暗示了游戏的基本玩法是回合制,玩家在自己的回合中通过卡牌来进行攻击、防御或其他行动。 最后,【压缩包子文件的文件名称列表】中只包含了"CardDemo",这可能表明这是整个项目唯一的文件或者是一个包含多个脚本的项目的主文件夹名称。由于只提供了一个文件名称,我们无法得知更多关于项目具体实现的细节。 总体而言,"Unity 回合制卡牌demo"项目的知识点涵盖了Unity 2D游戏开发的基础架构、游戏对象管理、基本的回合逻辑实现以及如何利用C#语言进行面向对象编程。这个demo对于希望开始学习Unity游戏开发,特别是对于那些想要制作回合制卡牌游戏的开发者来说是一个很好的起点。"
2023-08-31 上传
【资源说明】 基于Unity引擎制作的卡牌游戏地心之子源码+游戏说明.zip 一次多张,叠加联动,自由组合 # 项目介绍 ```text 一款能够同时打出多张卡牌的卡牌游戏。 玩家可以通过自由组合手中不同元素的卡牌,触发不同的元素联动效果. 也可以一次性打出多种相同元素的卡牌来加强每张卡牌的效果。 在这个元素构筑的地下世界,探索失落文明的秘密 ``` TodoList # 美术资源需求 除特殊说明 , 均导出为png格式图片 - 角色贴图 : 尺寸待定 | 人物 | 路径 | 关键字 | 进度 | |------|-----------|--------------|----| | 主角 | `Char/主角` | 火系,机械元素 | | | 女队医 | `Char/队医` | 木系,医生元素 | | | 老兵 | `Char/老兵` | 金系,军队元素,硬汉形象 | | | 厨师小胖 | `Char/厨师` | 土系 | | | 老科学家 | `Char/博士` | 水系 | | - 卡牌贴图 : 尺寸 1000x800 , 路径均为`Card/Details/{卡牌名}` | 卡牌名 | 关键字 | 进度 | |------|-----------------|------| | 试探 | 金 , 攻击 , 防守 | 完成 | | 格挡 | 金 , 防守 | 完成 | | 重击 | 金 , 打击感 | 完成 | | 盾击 | 金 , 厚重 | | | 铁甲加固 | 金 , 基于增加的护盾造成伤害 | 弃稿重用 | | | | | | 汲取 | 木 , 吸血 | 完成 | | 清醒 | 木 , 回蓝 | 完成 | | 包扎 | 木 , 回血 | 完成 | | 良药 | 木 , 持续性回血 | 完成 | | | | | | 法力狂涌 | 水 , 爆发攻击 | 完成 | | 积蓄 | 水 , 延迟攻击 , 蓄力 | | | 释放 | 水 , 攻击 | | | 暗潮涌动 | 水 , 延迟攻击 | | | | | | | 火力压制 | 火 , 多次打击 | 完成 | | 熔铁之刃 | 火 , 破甲 | 完成 | | 穿刺 | 火 , 穿透 , 锐利 | | | 焚烧 | 火 , 破坏力 | | | | | | | 魔法守护 | 土 , 防御 | 完成 | | 污泥之躯 | 土 , 耗血加盾 | | | 厄运 | 土 , 延迟伤害 | | | | | | | 渴望 | 无 , 功能牌 | 完成 | | 火之召唤 | 无 , 功能牌 | 完成 | - effect图标 : 尺寸 60x60 , 路径均为`Effect/Details/{effect名}` | effect名 | 关键字 | 进度 | |---------|--------------------|----| | 免疫 | 金土联动 , 免疫伤害 | 完成 | | 引燃 | 火木联动 , 百分比伤害 | 完成 | | 自燃 | 火木土 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
2018-11-03 上传
回合制自己写的 战斗DEMO 加动画状态 Q键移动并攻击。 代码很简单。不要抱有太大希望 。作为新手学习使用。 public enum HeroStatus { idle = 0, //空闲 attack, //攻击 other, //其他 hit, //受击 die, //死亡 defense, //防御 cast, //施法 miss, //闪避 seriousInjury, //重伤 move, //移动 exit, //获取下一个状态 MAX, } public class hero : MonoBehaviour { public UISpriteAnimation m_spriteAnimation = null; public HeroStatus m_staus = HeroStatus.exit; //身体碰撞盒 public BoxCollider m_bodyBC = null; public string m_name = ""; public AttackCrash m_attackCrash = null; public byte m_posIndex = 0; void Awake() { m_spriteAnimation = transform.GetComponent(); m_bodyBC = transform.GetComponent(); } // Use this for initialization void Start () { m_spriteAnimation.AddFrameCallBack("attack", 1, AttackCallBack); m_spriteAnimation.AddFrameCallBack("attack", 4, AttackCallBack); m_spriteAnimation.AddFrameCallBack("attack", 7, AttackCallBack); } public float m_speed = 1f; public float m_offset = 0.5f; public Vector3 m_destination = Vector3.zero; public List m_actionList = new List(); // Update is called once per frame void Update () { switch (m_staus) { case HeroStatus.idle: //空闲状态 if (m_actionList.Count > 0) m_staus = HeroStatus.exit; break; case HeroStatus.attack: if (!m_spriteAnimation.isPlaying) { //攻击动画播放完毕 m_staus = HeroStatus.exit; } break; case HeroStatus.defense: transform.position = Vector3.MoveTowards(transform.position, m_destination, m_speed * Time.deltaTime); if (transform.position == m_destination) m_staus = HeroStatus.exit; break; case HeroStatus.hit: transform.position = Vector3.MoveTowards(transform.position, m_destination, m_speed * Time.deltaTime); if (transform.position == m_destination) m_staus = HeroStatus.exit; break; case HeroStatus.die: break; case HeroStatus.cast: break; case HeroStatus.miss: break; case HeroStatus.seriousInjury: break; case HeroStatus.move: transform.position = Vector3.MoveTowards(transform.position, m_destination, m_speed * Time.deltaTime); if (transform.position == m_destination) m_staus = HeroStatus.exit; break; case HeroStatus.exit: //获取下一个状态 if (m_actionList.Count > 0) { string str = "idle"; switch(m_actionList[0].status) { case HeroStatus.move: str = "idle"; break; default: str = Enum.GetName(typeof(HeroStatus), m_actionList[0].status); break; } m_spriteAnimation.namePrefix = str; m_spriteAnimation.loop = m_actionList[0].loop; m_destination = m_actionList[0].destinationMove; m_speed = m_actionList[0].speed; m_spriteAnimation.ResetToBeginning(); m_staus = m_actionList[0].status; m_actionList.RemoveAt(0); } else { m_spriteAnimation.namePrefix = Enum.GetName(typeof(HeroStatus), HeroStatus.idle); m_spriteAnimation.loop = true; m_spriteAnimation.ResetToBeginning(); m_staus = HeroStatus.idle; } break; // case HeroStatus.moveback: // //transform.position = Vector3.SmoothDamp(transform.position, destinationMove, ref cameraVelocity, smoothTime); // transform.position = Vector3.MoveTowards(transform.position, destinationMove, m_speed * Time.deltaTime); // if (transform.position == destinationMove) // m_staus = HeroStatus.idle; // break; } } public void SetPosition(byte pos, float x, float y) { m_posIndex = pos; transform.localPosition = new Vector3(x, y); } public void AttackCallBack() { //创建攻击特效 A攻击B B掉血222 B反击A闪避 UnityEngine.Object sourceObj = Resources.Load("AttackCrash"); GameObject go = UnityEngine.Object.Instantiate(sourceObj) as GameObject; go.transform.parent = transform; go.transform.localScale = Vector3.one; go.transform.localPosition = new Vector3(-70, 0, 0); } private void OnCollisionEnter(Collision co) { //进入碰撞 Debug.Log("进入碰撞!"); UnityEngine.Object sourceObj = Resources.Load("Effect"); GameObject go = UnityEngine.Object.Instantiate(sourceObj) as GameObject; go.transform.parent = transform; go.transform.localScale = Vector3.one; go.transform.localPosition = new Vector3(0, 0, 0); //Defense(); Hit(); } public void Attack(GameObject aims) { ActionData tmpAD = new ActionData(); tmpAD.status = HeroStatus.move; tmpAD.loop = true; UISprite tmpS = transform.GetComponent(); tmpAD.destinationMove = GameObject.Find("UI Root/Camera").transform.TransformPoint(new Vector3(aims.transform.localPosition.x + (tmpS.width/2), aims.transform.localPosition.y)); tmpAD.speed = Vector3.Distance(transform.position, tmpAD.destinationMove) * 4; //4/1秒到达目的地 m_actionList.Add(tmpAD); ActionData tmpAD1 = new ActionData(); tmpAD1.status = HeroStatus.attack; tmpAD1.loop = false; tmpAD1.destinationMove = Vector3.zero; tmpAD1.speed = 0; m_actionList.Add(tmpAD1); ActionData tmpAD2 = new ActionData(); tmpAD2.status = HeroStatus.move; tmpAD2.loop = true; tmpAD2.destinationMove = transform.position; tmpAD2.speed = Vector3.Distance(tmpAD.destinationMove, tmpAD2.destinationMove) * 4; //4/1秒到达目的地 m_actionList.Add(tmpAD2); } public void Defense() { ActionData tmpAD = new ActionData(); tmpAD.status = HeroStatus.defense; tmpAD.loop = false; tmpAD.destinationMove = GameObject.Find("UI Root/Camera").transform.TransformPoint(new Vector3(transform.localPosition.x - 25, transform.localPosition.y)); tmpAD.speed = 0.25f; //4/1秒到达目的地 m_actionList.Add(tmpAD); ActionData tmpAD1 = new ActionData(); tmpAD1.status = HeroStatus.move; tmpAD1.loop = false; tmpAD1.destinationMove = transform.position; tmpAD1.speed = 0.8f; //4/1秒到达目的地 m_actionList.Add(tmpAD1); } public void Hit() { ActionData tmpAD = new ActionData(); tmpAD.status = HeroStatus.hit; tmpAD.loop = false; tmpAD.destinationMove = GameObject.Find("UI Root/Camera").transform.TransformPoint(new Vector3(transform.localPosition.x - 25, transform.localPosition.y)); tmpAD.speed = 0.3f; //4/1秒到达目的地 m_actionList.Add(tmpAD); ActionData tmpAD1 = new ActionData(); tmpAD1.status = HeroStatus.move; tmpAD1.loop = false; tmpAD1.destinationMove = transform.position; tmpAD1.speed = 0.8f; //4/1秒到达目的地 m_actionList.Add(tmpAD1); } public void Idle() { m_spriteAnimation.namePrefix = Enum.GetName(typeof(HeroStatus), HeroStatus.idle); m_spriteAnimation.loop = true; m_spriteAnimation.ResetToBeginning(); m_staus = HeroStatus.idle; } public void Move() { // //transform.GetComponent().depth = 99; // GameObject go = GameObject.Find("enemy").gameObject; // destinationMove = GameObject.Find("UI Root/Camera").transform.TransformPoint(new Vector3(go.transform.localPosition.x + 98,go.transform.localPosition.y,go.transform.localPosition.z)); // m_speed = Vector3.Distance(transform.position, destinationMove) * 4; //4/1秒到达目的地 // m_staus = HeroStatus.moveto; // m_spriteAnimation.namePrefix = Enum.GetName(typeof(HeroStatus), HeroStatus.idle); // m_spriteAnimation.loop = true; // m_spriteAnimation.ResetToBeginning(); }