Unity 回合制战斗

本文详细介绍了如何使用Unity引擎创建一个基于回合制系统的3D战斗游戏,包括游戏设计、回合制系统实现、角色属性和行为以及UI设计。通过提供的代码示例,展示了如何管理角色的行动顺序、计算伤害和展示游戏界面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引言

        回合制战斗游戏是一种流行的游戏类型,它的基本玩法是让玩家控制角色在回合制系统下进行战斗。本文将介绍如何使用Unity引擎实现一个基于回合制系统的3D战斗游戏,并提供完整的代码和注释。

游戏设计

        我们的回合制战斗游戏将包括一个主菜单场景和一个战斗场景。主菜单场景将提供游戏开始、选项和退出功能,而战斗场景将以回合制系统为基础,玩家可以使用不同的技能和道具来攻击敌人并保护自己。

回合制系统

        在回合制系统中,每个角色都有一个行动条,当行动条充满时,该角色就可以执行行动。在我们的游戏中,我们将使用一个计时器来模拟行动条,并在行动条充满时使角色执行行动。

以下是我们实现回合制系统的代码:

public class TurnManager : MonoBehaviour {

   public List<GameObject> players;
   public List<GameObject> enemies;
  
   private float timer = 0.0f;
   private bool isPlayerTurn = true;
   private int currentPlayerIndex = 0;
   private int currentEnemyIndex = 0;

   // Update is called once per frame
   void Update () {
       timer += Time.deltaTime; 
     
       if(isPlayerTurn && timer >= players[currentPlayerIndex].GetComponent<Character>().speed) {
           timer = 0.0f;
           players[currentPlayerIndex].GetComponent<Character>().TakeAction();
           currentPlayerIndex++;
          
           if(currentPlayerIndex >= players.Count) {
               currentPlayerIndex = 0;
               isPlayerTurn = false;
           }
       }
   
       if(!isPlayerTurn && timer >= enemies[currentEnemyIndex].GetComponent<Character>().speed) { 
           timer = 0.0f;
           enemies[currentEnemyIndex].GetComponent<Character>().TakeAction();
           currentEnemyIndex++;
          
           if(currentEnemyIndex >= enemies.Count) {
               currentEnemyIndex = 0;
               isPlayerTurn = true;
           }
       }
   }
}

        角色属性和行为 在我们的游戏中,每个角色都有自己的属性和行为。以下是我们在Character类中实现的一些基本功能:

public class Character : MonoBehaviour {

   public float maxHealth = 100.0f;
   public float currentHealth = 100.0f;
   public float attack = 10.0f;
   public float defense = 5.0f;
   public float speed = 1.0f;
  
   public void Attack(Character target) {
       float damage = attack - target.defense;
       if(damage < 0)
           damage = 0;
      
       target.TakeDamage(damage);
   }
  
   public void TakeDamage(float damage) {
       currentHealth -= damage;
       if(currentHealth <= 0)
           Die();
   }
   
   private void Die() {
       // 角色死亡的代码
   }

   // 加载角色属性的代码
}

        在这段代码中,我们定义了一个Attack方法来计算伤害并攻击目标角色。如果攻击值小于目标角色的防御值,我们将伤害设为0,以避免产生负数。我们还定义了一个TakeDamage方法来计算受到的伤害,并在当前生命值小于等于0时执行Die方法。

        UI设计 为了给玩家提供更好的游戏体验,我们需要设计一个完整的UI界面,包括角色属性、技能和道具等。以下是我们在Unity中实现的一些基本UI元素:

public class UIManager : MonoBehaviour {

   public GameObject playerPanel;
   public GameObject enemyPanel;

   // 加载玩家和敌人的属性信息
   public void LoadPlayerData(Character player) {
       // 加载玩家属性信息的代码
   }

   public void LoadEnemyData(Character enemy) {
       // 加载敌人属性信息的代码
   }

   // 更新角色属性信息
   public void UpdatePlayerData(Character player) {
       // 更新玩家属性信息的代码
   }

   public void UpdateEnemyData(Character enemy) {
       // 更新敌人属性信息的代码
   }

   // 显示技能和道具
   public void ShowSkills(List<Skill> skills) {
       // 显示技能的代码
   }

   public void ShowItems(List<Item> items) {
       // 显示道具的代码
   }
}

        在这段代码中,我们定义了一个UI管理器UIManager,它包括两个面板:玩家面板和敌人面板。我们可以使用LoadPlayerData和LoadEnemyData方法来加载玩家和敌人的属性信息,并使用UpdatePlayerData和UpdateEnemyData方法来更新属性信息。我们还可以使用ShowSkills和ShowItems方法来显示可用的技能和道具。

总结

        在本文中,我们介绍了如何使用Unity引擎实现基于回合制系统的3D战斗游戏,并提供完整的代码和注释。通过学习本教程,读者将了解如何实现回合制系统、设计角色属性和行为以及创建UI界面。此外,读者还可以根据自己的需要进一步扩展游戏功能,例如添加新的技能、道具和敌人等。

回合制自己写的 战斗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(); }
Unity是一款流行的游戏开发引擎,可以用于创建各种类型的游戏,包括回合制战斗系统回合制战斗系统是一种常见的游戏战斗机制,玩家和敌人轮流进行行动。 在Unity中创建回合制战斗系统可以遵循以下步骤: 首先,需要创建表示玩家和敌人的角色。可以使用Unity的角色生成工具或自定义角色模型进行创建。每个角色都应该有相关的属性,如血量、攻击力和防御力等。 接下来,需要设计战斗场景。可以创建一个2D或3D的地图,并设置战斗场景的背景、障碍物和其他元素。这样可以让玩家和敌人在合适的环境中进行战斗。 然后,需要编写回合制战斗系统的逻辑。可以使用Unity提供的脚本编写工具,创建角色行动和战斗规则的逻辑。例如,当轮到玩家行动时,可以让玩家选择技能或道具进行攻击或治疗。而当轮到敌人时,可以设置敌人的行为模式,如随机攻击或使用特定技能。 在战斗过程中,可以显示角色的状态和动作。可以创建UI界面,显示每个角色的血量、能量和效果状态。还可以使用动画和特效来展示角色的攻击和受伤过程,增强游戏的沉浸感。 最后,需要对战斗系统进行测试和优化。可以通过与游戏好友或使用Unity的测试工具进行测试,确保战斗系统的平衡性和流畅性。如果发现问题,可以调整角色属性、战斗规则或优化代码,以获得更好的游戏体验。 总的来说,Unity提供了强大的工具和功能,可以方便地实现回合制战斗系统。通过合理的设计和编码,可以创建出令人满意的游戏战斗体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值