Unity3D自学笔记——架构应用(九)加载角色数据

加载角色数据

这里写图片描述
当点击进入游戏按钮后,将会切换至战斗场景,战斗场景里需要加载指定英雄的模型和角色数据。

角色模型数据的创建
角色模型,通过数据库存储PrefabName, 再从资源文件夹读取相应名字的Prefab进行动态创建

表heroinfo创建字段,存放Prefab在资源文件夹下的相对路径
这里写图片描述
更新HeroEntity,增加PrefabName属性,及其他对应文件的修改

HeroEntity

 public virtual string PrefabName { get; set; }

HeroMap

Map(x => x.PrefabName).Column("prefabName");

这样在UserEntity->HeroEntity里就有了模型路径

这里写图片描述

进入游戏按钮处理
需要在缓存里增加一个类型,叫SelectedUser,表示当前玩家所选择的角色

public enum PhotonCacheType
{
    Account,
    User,
    HeroList,
    SelectedUser
}

UISelectHero
选择英雄时,创建一个变量存放当前所选择的UserEntity

private UserEntity m_SelectedUser;

private void TogButtonOnPointerClick(UnityEngine.EventSystems.PointerEventData obj)
    {
        //获取HeroId
        string heroID = obj.selectedObject.name;
        int id;
        heroID = heroID.Substring(heroID.Length - 1);       
        m_SelectedHeroID = (Int32.TryParse(heroID, out id)) ? id : 0;
        //显示英雄介绍
        m_HeroInfo.SetHeroInfo(m_SelectedHeroID);
        //判断英雄是否已经创建
        Dictionary<int, IEntity> users = PhotonDataCache.GetValue(PhotonCacheType.User);

        var user = users.Select(x => x.Value).Cast<UserEntity>().Where(x => x.Hero.ID == id);
        if(user.Count() > 0)
        {//英雄已经创建
            m_Bottom.ExistHero(true);
            m_Bottom.IptName.text = user.ToList().First().Name;
            //赋值变量
            m_SelectedUser = user.ToList().First();
        }
        else
        {
            m_Bottom.ExistHero(false);
            m_Bottom.IptName.text = string.Empty;
        }
    }

UIBottom
进入游戏点击按钮时间中,首先将选中的UserEntity加入缓存,再切换场景,这样英雄数据就可以传递给Battle场景

 private void BtnEnterOnClick(PointerEventData obj)
    {
        if (m_SelectHero.SelectedUser != null)
        {
            PhotonDataCache.AddOrUpdateDataCache(PhotonCacheType.SelectedUser, m_SelectHero.SelectedUser);
            //切换场景
            StartCoroutine(GameMain.Instance.LoadScene(SceneName.Battle));
        }
        else
        {
            Debug.Log("Error");
        }
    }

Battle Scene
创建一个出生点,用于创建英雄模型的位置
这里写图片描述
空物体也行,只是为了占一个坑
这里写图片描述
在BattleManager里面添加脚本,控制英雄的创建,在Awake里进行初始化,是因为很多脚本对Player有依赖,它要第一个存在,如相机在Start里面要获得Player。如果放在Start里,相机就可能找不到Player而报错(除非修改脚本执行顺序)

public class BattleManager : UISingleton<BattleManager> {
    private GameObject m_player;
    private Transform m_SpawnPointHero;
    private PlayerStatus m_PlayerStatus;
    UserEntity m_User;

    void Awake()
    {
        m_SpawnPointHero = transform.Find("SpawnPointHero");
        //从缓存中读取所选择的英雄数据
        m_User = PhotonDataCache.GetValue<UserEntity>(PhotonCacheType.SelectedUser);
        if (m_User != null)
        {
            //加载英雄模型
            GameObject m_Hero = Resources.Load(m_User.Hero.PrefabName) as GameObject;
            //创建英雄模型,置于出生点
            this.m_player = GameObject.Instantiate(m_Hero, m_SpawnPointHero.position, Quaternion.identity) as GameObject;
            //加载英雄状态,如等级,名字,HP等
            this.m_PlayerStatus = m_player.GetComponent<PlayerStatus>();
            m_PlayerStatus.Load(m_User);
        }
    }
}

英雄模型下挂载的脚本,一个是控制动作,一个是实时状态
这里写图片描述
测试,就要一个名字

public class PlayerStatus : MonoBehaviour {
    public string PlayerName { get; set; }
    public void Load(UserEntity user)
    {
        this.PlayerName = user.Name;
    }
}

然后在UGUI里读取PlayerStatus
这里写图片描述

文件结构
这里写图片描述

组件情况
UI_Battle -> UIInfo
UIScene_PlayerInfo -> UIPlayerInfo -> UIScene

赋值

public class UIPlayerInfo : UIScene {
    private Image m_ImgHead;
    private Text m_TxtLv;
    private Text m_TxtName;
    private Text m_TxtHp;
    private Text m_TxtMp;
    private Slider m_SldHp;
    private Slider m_SldMp;
    private Slider m_SldExp;

    private PlayerStatus m_PlayerStatus;

    protected override void Start()
    {
        base.Start();
        InitWidget();
    }

    private void InitWidget()
    {
        this.m_ImgHead = UIHelper.FindChild<Image>(transform, "imgHead");
        this.m_TxtLv = UIHelper.FindChild<Text>(transform, "txtLv");
        this.m_TxtName = UIHelper.FindChild<Text>(transform, "txtName");
        this.m_SldHp = UIHelper.FindChild<Slider>(transform, "sldHp");
        this.m_SldMp = UIHelper.FindChild<Slider>(transform, "sldMp");
        this.m_SldExp = UIHelper.FindChild<Slider>(transform, "sldExp");
        this.m_TxtHp = UIHelper.FindChild<Text>(transform, "sldHp/text");
        this.m_TxtMp = UIHelper.FindChild<Text>(transform, "sldMp/text");
        GameObject player = GameObject.FindGameObjectWithTag("Player");
        if (player != null)
        {
            this.m_PlayerStatus = player.GetComponent<PlayerStatus>();
            this.m_TxtName.text = this.m_PlayerStatus.PlayerName;
        }
    }
}

测试
由于和服务器关联,所以需要从登录场景一步步进行,不然缓存里没有数据

登录
没做注销功能,所以每次都要去改数据库
这里写图片描述
角色选择
这里写图片描述
进入游戏
名字已经加载出来
这里写图片描述

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值