项目文件找出来了,老版本的脚本有报错,我在新版2019.4.21f1c1下解决了报错,战斗场景可以正常跑的。
需要的同学点下面地址下载(关注就行啦不用积分),祝大家都早日学成
————————————————————————
今天的这篇名字升级到“高级篇”了,因为战斗这块已经实现了原本的学习预期,接下来准备去搞搞角色创建、数据存储和主场景控制这些东西了。
这次高级篇的效果请看Gif:
新增内容如下:
1. 增加了远程兵种--弓箭手
2. 在单位等待行动阶段添加了特效(显示当前等待指令的是那个单位)
3. 最明显的就是场景加了些修饰
4. Gif因为没有音效不带感,实际是有场景和各种攻击音效的
特效资源也是从Assest Store找的免费的KTK Effect Sample Set.unitypackage,关于特效预制体的使用和参数修改看看教程就行,这里就不介绍啦。
本次涉及修改的内容如下:
UnitStats脚本,增加了一个用于区别单位攻击类型的变量。
public int attackType = 0; //单位攻击类型,0为近战,1远程
BattleTurnSystem脚本,
···在选中操作单位时根据单位当前position实例化特效预制体
···在得到攻击目标信息后(玩家的指令已经输入完毕)删除特效
下面先标出改动的几个函数,首先是ToBattle函数中获取当前行动对象时的修改
public void ToBattle()
{
remainingEnemyUnits = GameObject.FindGameObjectsWithTag("EnemyUnit");
remainingPlayerUnits = GameObject.FindGameObjectsWithTag("PlayerUnit");
//检查存活敌人单位
if (remainingEnemyUnits.Length == 0)
{
Debug.Log("敌人全灭,战斗胜利");
endImageText.text = "战斗胜利";
endImageText.color = Color.green;
endImage.SetActive(true); //显示胜利界面
}
//检查存活玩家单位
else if (remainingPlayerUnits.Length == 0)
{
Debug.Log("我方全灭,战斗失败");
endImageText.text = "战斗失败";
endImageText.color = Color.red;
endImage.SetActive(true); //显示失败界面
}
else
{
//取出参战列表第一单位,并从列表移除
currentActUnit = battleUnits[0];
battleUnits.Remove(currentActUnit);
//重新将单位添加至参战列表末尾
battleUnits.Add(currentActUnit);
//Debug.Log("当前攻击者:" + currentActUnit.name);
//获取该行动单位的属性组件
UnitStats currentActUnitStats = currentActUnit.GetComponent<UnitStats>();
//判断取出的战斗单位是否存活
if (!currentActUnitStats.IsDead())
{
//在该单位脚底下显示特效
thisPartical = Instantiate(partical_show, currentActUnit.transform.position, Quaternion.identity) as GameObject;
//选取攻击目标
FindTarget();
}
else
{
//Debug.Log("目标死亡,跳过回合");
ToBattle();
}
}
}
然后是获取到攻击目标后销毁特效,由于玩家和怪物的选取目标方式不一样,所以有2处要增加销毁命令
void FindTarget()
{
if (currentActUnit.tag == "EnemyUnit")
{
//如果行动单位是怪物则从存活玩家对象中随机一个目标
int targetIndex = Random.Range(0, remainingPlayerUnits.Length);
currentActUnitTarget = remainingPlayerUnits[targetIndex];
Destroy(thisPartical); //选择完目标后删除标识当前行动单位的特效
attackTypeName = "无情撕咬";
//如果是远程单位直接在这里LaunchAttack,就不需要RunToTarget
if (currentActUnit.GetComponent<UnitStats>().attackType == 1)
{
LaunchAttack();
}
else
{
RunToTarget();
}
}
else if (currentActUnit.tag == "PlayerUnit")
{
isWaitForPlayerToChooseSkill = true;
}
}
以及
void Update()
{
if (isWaitForPlayerToChooseTarget)
{
targetChooseRay = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(targetChooseRay, out targetHit))
{
if (Input.GetMouseButtonDown(0) && targetHit.collider.gameObject.tag == "EnemyUnit")