数据
- 在物品系统增加一个新的物品类,手榴弹类,定义手榴弹依附物体的类、配表数据类、背包内物品数据类、新建配表、在背包增加手榴弹数组;
- 手榴弹的预制体需要可拾取的、扔出的;
- 背包界面增加背包内的手榴弹、场景里的手榴弹、别人背包的手榴弹格子;
- 人物有一个int grenadeIndex记录当前拿着的手榴弹在背包手榴弹列表的索引,没拿手榴弹时是-1;
逻辑
- 在交互系统的拾取物品分支增加对手榴弹类的判断;
- GetNextGrenade():在背包的手榴弹列表遍历,有和grenadeIndex类型不同的手榴弹则返回索引,没有则返回-1;
public int GetNextGrenade(){
if(grenadeInHandIndex==-1){//手里没有手榴弹
if(backpack.itemsInPack.grenadesInPack.Count>0){//背包里有,拿第一个
return 0;
}
else{
return -1;//背包里没有,不拿
}
}
for(int i=0;i<backpack.itemsInPack.grenadesInPack.Count;i++){//手里有手榴弹,切换下一种
if(backpack.itemsInPack.grenadesInPack[i].id!=
backpack.itemsInPack.grenadesInPack[grenadeInHandIndex].id){
return i;
}
}
return -1;
}
- UseGrenade(),先执行grenadeIndex=GetNextGrenade(),在右手实例化手榴弹,没有则回到空手;
public void UseGrenade(){
grenadeInHandIndex=GetNextGrenade();//去背包拿手榴弹
if(grenadeInHandIndex==-1){//没拿到
PutAwayGun();
return;
}
animator.SetInteger(gunStatusPara,3);
GrenadeDataBin grenadeDataBin=ItemDataManager.Instance.GetGrenadeData(
backpack.itemsInPack.grenadesInPack[grenadeInHandIndex].id);
grenadeInHand=Instantiate(grenadeDataBin.prefab,weaponHolder).GetComponent<Grenade>();
grenadeInHand.grenadeDataBin = grenadeDataBin;
grenadeInHand.owner=this;
}
- 扔手榴弹方法通过动画事件执行
public void ThrowGrenade(){
grenadeInHand.Throwed(aimAxis.forward*throwSpeed);
backpack.TakeOutGrenade(grenadeInHandIndex);
grenadeInHand=null;
grenadeInHandIndex=-1;
UseGrenade();//拿下一个或空手
}
public void Throwed(Vector3 velocity){
transform.SetParent(null);
rigidbody.isKinematic=false;
collider.isTrigger=false;
rigidbody.velocity=velocity;
Destroy(gameObject,lifeTime);
}
动画
- 手榴弹动画放在上半身层,有一个空闲动画和投掷动画;