【UnityRPG游戏制作】Unity_RPG项目_玩法相关


👨‍💻个人主页@元宇宙-秩沅

👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍💻 本文由 秩沅 原创
👨‍💻 收录于专栏就业宝典

⭐🅰️推荐专栏⭐

⭐-软件设计师高频考点大全



文章目录

    • ⭐前言⭐
    • [🎶(==四==) 玩法相关](#🎶(==四==) 玩法相关)
    • [(==1==) 面板显隐命令](#(==1==) 面板显隐命令)
    • [(==2==) 玩家升级命令](#(==2==) 玩家升级命令)
    • [(==3==) 玩家受伤命令](#(==3==) 玩家受伤命令)
    • [(==4==) 经验升级命令](#(==4==) 经验升级命令)
    • [(==5==) 武器和伤害命令](#(==5==) 武器和伤害命令)
    • ⭐🅰️⭐

⭐前言⭐


🎶(四) 玩法相关



(1) 面板显隐命令


csharp 复制代码
using PureMVC.Interfaces;
using PureMVC.Patterns.Command;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//-------------------------------
//-------功能:  面板隐藏命令
//-------创建者:         
//------------------------------

public class HidePanelCommand : SimpleCommand
{

    public override void Execute(INotification notification)
    {
        base.Execute(notification);
        Debug.Log("隐藏面板的命令开始执行");
        string panelName = notification.Body.ToString();
        //Debug.Log(panelName);
        SelectPanel(panelName);
    }

    /// <summary>
    /// 封装选择需要执行的面板
    /// </summary>
    /// <param name="panelName"></param>
    private void SelectPanel(string panelName)
    {
        //面板命令的选择
        switch (panelName)
        {
            case "BackpackPanel":
                Debug.Log("命令为BackpackPanel");
                if (!Facade.HasMediator(BackpackViewMediator.NAME))  //首先判断是否有该中介,没有就new一个
                {
                    Facade.RegisterMediator(new BackpackViewMediator()); //注册该视图中介
                }
                //获取视图对应的中介
                BackpackViewMediator bm = Facade.RetrieveMediator(BackpackViewMediator.NAME) as BackpackViewMediator;

                if (bm.ViewComponent != null) //当对应的视图中介有关联界面面板时 
                {
                    //通过UI管理器隐藏面板
                    UIManager.GetInstance().HidePanel("BackpackPanel");
                }
                break;
            case "DefeatPanel":
                Debug.Log("命令为DefeatPanel");
                if (!Facade.HasMediator(DefeatViewMediator.NAME))  //首先判断是否有该中介,没有就new一个
                {
                    Facade.RegisterMediator(new DefeatViewMediator()); //注册该视图中介
                }
                //获取视图对应的中介
                DefeatViewMediator dm = Facade.RetrieveMediator(DefeatViewMediator.NAME) as DefeatViewMediator;

                if (dm.ViewComponent != null) //当对应的视图中介有关联界面面板时 
                {          
                    //通过UI管理器隐藏面板
                    UIManager.GetInstance().HidePanel("DefeatPanel");          
                }
                break;
            case "GamePanel":
                Debug.Log("GamePanel");
                if (!Facade.HasMediator(GameViewMediator.NAME))  //首先判断是否有该中介,没有就new一个
                {
                    Facade.RegisterMediator(new GameViewMediator()); //注册该视图中介
                }
                //获取视图对应的中介
                GameViewMediator gm = Facade.RetrieveMediator(GameViewMediator.NAME) as GameViewMediator;


                if (gm.ViewComponent != null) //当对应的视图中介有关联界面面板时 
                {
                    //通过UI管理器隐藏面板
                    UIManager.GetInstance().HidePanel("GamePanel");
                }
                break;
            case "NPCTipPanel":
                Debug.Log("NPCTipPanel");
                if (!Facade.HasMediator(NPCTipViewMediator.NAME))  //首先判断是否有该中介,没有就new一个
                {
                    Facade.RegisterMediator(new NPCTipViewMediator()); //注册该视图中介
                }
                //获取视图对应的中介
                NPCTipViewMediator nm = Facade.RetrieveMediator(NPCTipViewMediator.NAME) as NPCTipViewMediator;

                if (nm.ViewComponent != null) //当对应的视图中介有关联界面面板时 
                {
                    //通过UI管理器隐藏面板
                    UIManager.GetInstance().HidePanel("NPCTipPanel");
                }
                break;

            case "RolePanel":
                Debug.Log("命令为RolePanel");
                if (!Facade.HasMediator(RoleViewMediator.NAME))  //首先判断是否有该中介,没有就new一个
                {
                    Facade.RegisterMediator(new RoleViewMediator()); //注册该视图中介
                }
                //获取视图对应的中介
                RoleViewMediator rm = Facade.RetrieveMediator(RoleViewMediator.NAME) as RoleViewMediator;

                if (rm.ViewComponent != null) //当对应的视图中介有关联界面面板时 
                {
                    //通过UI管理器隐藏面板
                    UIManager.GetInstance().HidePanel("RolePanel");
                }
                break;

            case "StartPanel":
                Debug.Log("StartPanel");
                if (!Facade.HasMediator(StartViewMediator.NAME))  //首先判断是否有该中介,没有就new一个
                {
                    Facade.RegisterMediator(new StartViewMediator()); //注册该视图中介
                }
                //获取视图对应的中介
                StartViewMediator sm = Facade.RetrieveMediator(StartViewMediator.NAME) as StartViewMediator;

                if (sm.ViewComponent != null) //当对应的视图中介有关联界面面板时 
                {
                    //通过UI管理器隐藏面板
                    UIManager.GetInstance().HidePanel("StartPanel");
                }
                break;
            case "StartTipPanel":
                Debug.Log("StartTipPanel");
                if (!Facade.HasMediator(StartTipViewMediator.NAME))  //首先判断是否有该中介,没有就new一个
                {
                    Facade.RegisterMediator(new StartTipViewMediator()); //注册该视图中介
                }
                //获取视图对应的中介
                StartTipViewMediator stm = Facade.RetrieveMediator(StartTipViewMediator.NAME) as StartTipViewMediator;

                if (stm.ViewComponent != null) //当对应的视图中介有关联界面面板时 
                {
                    //通过UI管理器隐藏面板
                    UIManager.GetInstance().HidePanel("StartTipPanel");
                }
                break;
            case "StatePanel":
                Debug.Log("命令为StatePanel");
                if (!Facade.HasMediator(StateViewMediator.NAME))  //首先判断是否有该中介,没有就new一个
                {
                    Facade.RegisterMediator(new StateViewMediator()); //注册该视图中介
                }
                //获取视图对应的中介
                StateViewMediator mm = Facade.RetrieveMediator(StateViewMediator.NAME) as StateViewMediator;

                if (mm.ViewComponent != null) //当对应的视图中介有关联界面面板时 
                {
                    //通过UI管理器隐藏面板
                    UIManager.GetInstance().HidePanel("StatePanel");
                }
                break;
        }
    }
}

(2) 玩家升级命令


csharp 复制代码
using PureMVC.Interfaces;
using PureMVC.Patterns.Command;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//-------------------------------
//-------功能:  玩家升级通知
//-------创建者:         
//------------------------------

public class LevelUpCommand : SimpleCommand
{
    public override void Execute(INotification notification)
    {
        base.Execute(notification);
        PlayerProxy playerProxy =  Facade.RetrieveProxy(PlayerProxy.NAME) as PlayerProxy ;

        if (playerProxy != null)
        {
            playerProxy.LevUp (); //自己将数据升级
            playerProxy.SavaUp(); //数据保存
            SendNotification(PureNotification.UPDATA_ROLE_INFO, playerProxy.Data as PlayerDataObj) ; //发送角色信息更新通知
        }
       
    }
}

(3) 玩家受伤命令


  • 血条减少,玩家数据更新
  • 观察者模式
csharp 复制代码
using PureMVC.Interfaces;
using PureMVC.Patterns.Command;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//-------------------------------
//-------功能: 受伤命令
//-------创建者:         -------
//------------------------------

public class HurtCommand : SimpleCommand
{
    public override void Execute(INotification notification)
    {
        base.Execute(notification);
        Debug.Log("玩家受伤的命令开始执行");
        PlayerProxy playerProxy = Facade.RetrieveProxy(PlayerProxy.NAME) as PlayerProxy;

        if (playerProxy != null)
        {
            playerProxy.LevUp(); //自己将数据升级
            playerProxy.SavaUp(); //数据保存

            SendNotification(PureNotification.UPDATA_ROLE_INFO, playerProxy.Data as PlayerDataObj); //发送角色信息更新通知
            SendNotification(PureNotification.PLAYER_INJURY, notification.Body);
        }

    }
}
csharp 复制代码
using PureMVC.Interfaces;
using PureMVC.Patterns.Mediator;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//-------------------------------
//-------功能:  角色面板视图中介
//-------创建者:         -------
//------------------------------

/// <summary>
/// 角色面板视图中介
/// 固定:
/// 1.继承PureMVC的Mediator脚本
/// 2.写构造函数
/// 3.重写监听通知的方法
/// 4.重写处理通知的方法
/// 5.可选:重写注册时的方法
/// </summary>
public class RoleViewMediator : Mediator
{
    //铭牌名
    public static string NAME = "RoleViewMediator";

    /// <summary>
    /// 构造函数
    /// </summary>
    public RoleViewMediator( ) : base(NAME)
    {
        //可以去写创捷面板预设体的逻辑等
    }


    /// <summary>
    /// 重写监听通知的方法,返回需要的监听(通知)
    /// </summary>
    /// <returns>返回你需要监听的通知的名字数组</returns>
    public  override string[] ListNotificationInterests()
    {
        return new string[] { 
         PureNotification.UPDATA_ROLE_INFO
        };
    }

    public void SetView(RoleView roleView)
    {
        Debug.Log(roleView + "执行SetView");
        ViewComponent = roleView;
        //开始按钮逻辑监听
        roleView.back.onClick.AddListener(() =>
        {
            SendNotification(PureNotification.HIDE_PANEL, "RolePanel");
        });
 
    }

    /// <summary>
    /// 重写处理通知的方法,处理通知
    /// </summary>
    /// <param name="notification">通知</param>
    public override void HandleNotification(INotification notification)
    {
       switch (notification.Name)
        {
          case  PureNotification.UPDATA_ROLE_INFO:
                if (ViewComponent != null)          (ViewComponent as RoleView).UpdateView(notification.Body as PlayerDataObj);
                else   {Debug.Log("为空");  }
                break;
        }
    }

    /// <summary>
    /// 可选:重写注册方法(他们需要到Facde中注册)
    /// </summary>
    public override void OnRegister()
    {
        base.OnRegister();
    }

}

(4) 经验升级命令


csharp 复制代码
using PureMVC.Interfaces;
using PureMVC.Patterns.Command;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//-------------------------------
//-------功能:  經驗更新命令-------
//-------创建者:         -------
//------------------------------

public class EXPUpCommand : SimpleCommand
{
    public override void Execute(INotification notification)
    {
        base.Execute(notification);
        SendNotification(PureNotification.UPDATA_EXP ,notification .Body);  //发送更新经验血条的通知
        
    }
}
csharp 复制代码
using PureMVC.Interfaces;
using PureMVC.Patterns.Command;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//-------------------------------
//-------功能:玩家升级通知
//-------创建者:         
//------------------------------

public class LevelUpCommand : SimpleCommand
{
    public override void Execute(INotification notification)
    {
        base.Execute(notification);
        PlayerProxy playerProxy =  Facade.RetrieveProxy(PlayerProxy.NAME) as PlayerProxy ;

        if (playerProxy != null)
        {
            playerProxy.LevUp (); //自己将数据升级
            playerProxy.SavaUp(); //数据保存
            SendNotification(PureNotification.UPDATA_ROLE_INFO, playerProxy.Data as PlayerDataObj) ; //发送角色信息更新通知
        }     
        

    }
}

(5) 武器和伤害命令


csharp 复制代码
using PureMVC.Interfaces;
using PureMVC.Patterns.Command;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//-------------------------------
//-------功能:更换武器图标的命令
//-------创建者:         -------
//------------------------------

public class WeaponUpCommand : SimpleCommand
{
    public override void Execute(INotification notification)
    {
        base.Execute(notification);
        //先将玩家数据中更新武器信息
        PlayerDataObj playerProxy = Facade.RetrieveProxy(PlayerProxy.NAME).Data  as PlayerDataObj ;
        playerProxy.nowItem = notification.Body as Sprite;
        //playerProxy.item[playerProxy.index] = notification.Body as Sprite;

        //到时打开role面板时会自动更新数据
        //  (playerProxy.Data as PlayerDataObj).nowItem = notification.Body as Sprite;
        //而后发送武器更新的通知------目的是更新State面板中的武器信息
      
        SendNotification(PureNotification.UPDATA_WEAPON_INFO2, notification.Body );


    }
}
csharp 复制代码
using PureMVC.Interfaces;
using PureMVC.Patterns.Command;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//-------------------------------
//-------功能: 受伤命令
//-------创建者:         -------
//------------------------------

public class HurtCommand : SimpleCommand
{
    public override void Execute(INotification notification)
    {
        base.Execute(notification);
        Debug.Log("玩家受伤的命令开始执行");
        PlayerProxy playerProxy = Facade.RetrieveProxy(PlayerProxy.NAME) as PlayerProxy;

        if (playerProxy != null)
        {
            //playerProxy.LevUp(); //自己将数据升级
           // playerProxy.SavaUp(); //数据保存

            SendNotification(PureNotification.UPDATA_ROLE_INFO, playerProxy.Data as PlayerDataObj); //发送角色信息更新通知
            SendNotification(PureNotification.PLAYER_INJURY, notification.Body);
        }
    }
}

⭐🅰️⭐


【Unityc#专题篇】之c#进阶篇】

【Unityc#专题篇】之c#核心篇】

【Unityc#专题篇】之c#基础篇】

【Unity-c#专题篇】之c#入门篇】

【Unityc#专题篇】---进阶章题单实践练习

【Unityc#专题篇】---基础章题单实践练习

【Unityc#专题篇】---核心章题单实践练习


你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!



相关推荐
charon87786 小时前
UE ARPG | 虚幻引擎战斗系统
游戏引擎
小春熙子7 小时前
Unity图形学之Shader结构
unity·游戏引擎·技术美术
Footprint_Analytics8 小时前
Footprint Analytics 助力 Sei 游戏生态增长
游戏·web3·区块链
Sitarrrr9 小时前
【Unity】ScriptableObject的应用和3D物体跟随鼠标移动:鼠标放置物体在场景中
3d·unity
极梦网络无忧9 小时前
Unity中IK动画与布偶死亡动画切换的实现
unity·游戏引擎·lucene
半盏茶香12 小时前
【C语言】分支和循环详解(下)猜数字游戏
c语言·开发语言·c++·算法·游戏
逐·風17 小时前
unity关于自定义渲染、内存管理、性能调优、复杂物理模拟、并行计算以及插件开发
前端·unity·c#
_oP_i19 小时前
Unity Addressables 系统处理 WebGL 打包本地资源的一种高效方式
unity·游戏引擎·webgl
PandaQue19 小时前
《怪物猎人:荒野》游戏可以键鼠直连吗
游戏
代码盗圣1 天前
GODOT 4 不用scons编译cpp扩展的方法
游戏引擎·godot