加载角色数据
当点击进入游戏按钮后,将会切换至战斗场景,战斗场景里需要加载指定英雄的模型和角色数据。
角色模型数据的创建
角色模型,通过数据库存储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;
}
}
}
测试
由于和服务器关联,所以需要从登录场景一步步进行,不然缓存里没有数据
登录
没做注销功能,所以每次都要去改数据库
角色选择
进入游戏
名字已经加载出来