综述
本次主要介绍小组最后一个游戏,本人主要参与部分道具的开发。
下面介绍这些道具信息以及代码实现。
内容
道具
在该游戏中,道具是随机生成的,有地雷、导弹、随机(里面有疾跑和隐身)和血瓶。他们的控制都是由一个脚本来决定的。
//生成道具
if(PhotonNetwork.IsMasterClient && PropsGameManager.instance.isGameStart)
{
//计时
if(currentTime > 0)
{
currentTime -= Time.deltaTime;
}
else
{
//判断道具数是否到达上限
if (currentCountInScene < maxSpawnCountPermit)
{
for (int i = 0; i < spawnCountOneTime; i++)
{
Vector3 pos = new Vector3(Random.Range(-18f, 18f), 1, Random.Range(-18f, 18f));
PhotonNetwork.Instantiate(Const.PUN_PROPS_GAME_PREFABS_BASEPATH
+ propsPrefabNameWithRandom[Random.Range(0, propsPrefabNameWithRandom.Length)]
, pos
, Quaternion.identity);
currentCountInScene++;
}
}
currentTime = spawnInterval;
}
}
通过一个属性来判断是哪一种类型的道具
public enum PropsType
{
None,
MissileProp, //炮弹
LandmineProp, //地雷
CloakProp,
HealthBottleProp, //血瓶
SpeedUpProp,//疾步
FlashSkill
}
对于每个随机生辰的道具,上面都有一个脚本,来控制道具的动画以及类型。
public PropsManager.PropsType propType = PropsManager.PropsType.HealthBottleProp;
另一个就是悬浮控制
//悬浮
private void Move()
{
startPos = transform.position;
transform.DOPath(new Vector3[] {
startPos, transform.position + new Vector3(0, 0.5f, 0), startPos }, 2)//Vector3.up//new Vector3(0,0.5f,0)
.SetLoops(-1, LoopType.Restart);
transform.DOBlendableLocalRotateBy(new Vector3(0, 360, 0), 4f, RotateMode.FastBeyond360);
.SetLoops(-1, LoopType.Restart);//循环设置为-1为一直
}
对于每一个道具都需要拾取,这个逻辑在人物的道具控制器中来完成。
public void OnTriggerEnter(Collider other)//TODO:同步背包
{
//IsPickingPropUp
if (!other.gameObject.tag.Equals("DroppedProps"))
{
return;
}
if(other.gameObject.GetComponent<DroppedProps>() != null)
{
if (other.gameObject.GetComponent<DroppedProps>().propType == PropsManager.PropsType.HealthBottleProp)//血瓶不参与背包计算,且血瓶一个单独脚本执行逻辑
{
return;
}
}
//是否销毁(是否捡的起来)由玩家拥有者的背包判决。
int index = 0;
//***:主要用以通知主机,因为只有主机控制着销毁悬浮道具,可换为PhotonNetwork.IsMasterClient
if (!photonView.IsMine)
{
if (PhotonNetwork.IsMasterClient)
{
PhotonNetwork.Destroy(other.gameObject);
PropsManager.DecreaseCurrentCount();//场上数量-1
}
else
{
other.gameObject.SetActive(false);
}
}
else//自己
{
index = FindVacantIndex();
DroppedProps dp = other.gameObject.GetComponent<DroppedProps>();
DroppedRandomProps drp = other.gameObject.GetComponent<DroppedRandomProps>();
if (dp != null)
{
itemBag[index] = dp.propType; //添加背包里捡的道具的类型
//UI
bagItemsPanel.GetChild(index).GetComponent<Image>().sprite
= GetSpriteByPropType(dp.propType);
}
else if(drp != null)
{
itemBag[index] = drp.propType; //添加背包里捡的道具的类型
//UI
bagItemsPanel.GetChild(index).GetComponent<Image>().sprite
= GetSpriteByPropType(drp.propType);
}
other.gameObject.SetActive(false);
}
AudioManager.instance.PropsGamePickUp();
}
对于每个拾取都是由音效来提示的。
其次,使用道具
首先是地雷,地雷拾取后,如果要是用,需要3秒的时间进行放置,期间不能被打断,然后就是放置后,会有一些粒子效果进行提示,该地区有地雷。
扫描二维码关注公众号,回复:
15117370 查看本文章
private void UseProp(PropsManager.PropsType type)//TODO:E技能计时UI
{
switch (type)
{
case PropsManager.PropsType.None:
AudioManager.instance.NoProps();
break;
case PropsManager.PropsType.LandmineProp:
//先判断当前执行的动画是不是站立idel
if (animator.GetCurrentAnimatorStateInfo(0).IsName("IdleNormal02_AR_Anim"))
{
Debug.Log("执行放置地雷的操作1");
DoAnimationWithEffect(2);
//创建地雷的方法
StartCoroutine(CreateLandMine(this.gameObject.transform.position));
}
else//不在空闲状态无法放置
{
tipText.text = "放置被打断";
Invoke("EmptyTipText", 1.5f);
}
break;
default:
break;
}
}
使用rpc进行生成地雷
//生成地雷
private IEnumerator CreateLandMine(Vector3 v)
{
AudioManager.instance.SetLandmine(v);
yield return new WaitForSeconds(3); //等待3秒
v.y = 0.001f;
photonView.RPC("LandMineCreate", RpcTarget.AllViaServer, v);
}
[PunRPC]
public void LandMineCreate(Vector3 pos) //使用rpc进行生成地雷,同步其他所有的人,都会生成地雷。
{
GameObject landmine = Instantiate(landminePrefab, pos, Quaternion.identity);
}
总结
本次主要介绍的是地雷的生成和放置,后续介绍地雷的销毁和其他道具。