TargetableObject是可当作目标物entity的逻辑脚本都要继承的脚本
实现接口:
- OnInit
- OnShow
- OnUpdate
- OnDead:GameEntry.Entity.HideEntity(this);
- OnTriggerEnter:计算伤害
自己的函数
public void ApplyDamage(Entity attacker, int damageHP)
{
float fromHPRatio = m_TargetableObjectData.HPRatio;
m_TargetableObjectData.HP -= damageHP;
float toHPRatio = m_TargetableObjectData.HPRatio;
if (fromHPRatio > toHPRatio)
{
GameEntry.HPBar.ShowHPBar(this, fromHPRatio, toHPRatio);
}
if (m_TargetableObjectData.HP <= 0)
{
OnDead(attacker);
}
}
自己的子类需要实现的接口
public abstract ImpactData GetImpactData();
————————
TargetableObjectData也是一个,分了阵营
AircraftData继承于它,这个data在onshow时作为user data传入,
传入时根据配置中的对象进行对应不同模块的加载:
public AircraftData(int entityId, int typeId, CampType camp)
: base(entityId, typeId, camp)
{
IDataTable<DRAircraft> dtAircraft = GameEntry.DataTable.GetDataTable<DRAircraft>();
DRAircraft drAircraft = dtAircraft.GetDataRow(TypeId);
if (drAircraft == null)
{
return;
}
m_ThrusterData = new ThrusterData(GameEntry.Entity.GenerateSerialId(), drAircraft.ThrusterId, Id, Camp);
for (int index = 0, weaponId = 0; (weaponId = drAircraft.GetWeaponIdAt(index)) > 0; index++)
{
AttachWeaponData(new WeaponData(GameEntry.Entity.GenerateSerialId(), weaponId, Id, Camp));
}
for (int index = 0, armorId = 0; (armorId = drAircraft.GetArmorIdAt(index)) > 0; index++)
{
AttachArmorData(new ArmorData(GameEntry.Entity.GenerateSerialId(), armorId, Id, Camp));
}
m_DeadEffectId = drAircraft.DeadEffectId;
m_DeadSoundId = drAircraft.DeadSoundId;
HP = m_MaxHP;
}
同时有自己的属性,包括存了其他内容的其他data等:
[SerializeField]
private int m_MaxHP = 0;
[SerializeField]
private int m_Defense = 0;
[SerializeField]
private int m_DeadEffectId = 0;
[SerializeField]
private int m_DeadSoundId = 0;
还有一些方法:如
private void RefreshData()
{
m_MaxHP = 0;
m_Defense = 0;
for (int i = 0; i < m_ArmorDatas.Count; i++)
{
m_MaxHP += m_ArmorDatas[i].MaxHP;
m_Defense += m_ArmorDatas[i].Defense;
}
if (HP > m_MaxHP)
{
HP = m_MaxHP;
}
}
————————————————
最后就是继承了targetobject的Aircraft了,
在OnShow中加载了武器和护盾。
至于这架机器的加载,则是在gamebase的initialize中:
GameEntry.Entity.ShowMyAircraft(new MyAircraftData(GameEntry.Entity.GenerateSerialId(), 10000)
{
Name = "My Aircraft",
Position = Vector3.zero,
});
GameEntry.Entity.ShowAsteroid(new AsteroidData(GameEntry.Entity.GenerateSerialId(), 60000 + Utility.Random.GetRandom(dtAsteroid.Count))
{
Position = new Vector3(randomPositionX, 0f, randomPositionZ),
});
观察这个showxx的函数,它的参数是一个data文件。
后面的60000和10000是一个typeid,entity带着的,一个唯一的编号,可以读取到。根据这个编号不不同的asteroid,在生成时就有所不同。