十三章:角色攻击系统
角色攻击是杀怪时的核心功能,攻击模式又可细分为普通攻击和技能攻击,其中技能攻击的信息存储在SkillInfoInList,本章节只涉及普通攻击部分。
为Magician添加一个PlayerAttack脚本,控制攻击
public enum PlayerState{
normalWalk,
normalAttack,
skillAttack
}
PlayerState state = PlayerState.normalWalk; //默认为Walk状态,在PlayerMove脚本中也要通过Walk状态控制普通状态下的移动,当状态为Walk时,才能进行移动。
public string aniName_normalAttack; //攻击动画,这些属性与小狼类似
public float normalPlayerAttackTime;
private float playerAttackTimer = 0;
public float minPlayerAttackDistance = 5;
private Transform normalAttackTarget; //攻击目标
void Update()
{
if (Input.GetMouseButtonDown (1)) //点击右键攻击
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); //与主角移动类似,参考(链接)
RaycastHit hitInfo;
bool isCollider = Physics.Raycast(ray,out hitInfo);
if(isCollider && hitInfo.collider.tag == Tags.enemy) //目标为enemy
{
normalAttackTarget = hitInfo.collider.transform; //传递目标
state = PlayerState.normalAttack; //切换攻击状态
}
else //若点击别的地方,则切换为Walk状态
{
state = PlayerState.normalWalk;
normalAttackTarget = null;
}
}
}
13.1 普通攻击状态
清楚了基本的角色攻击状态后,本节实现当state == PlayerState.normalAttack时的攻击状态。
首先当主角进行攻击时,要判断主角和怪物的距离。若超出攻击距离,主角进行移动并攻击;若未超出,直接攻击。在PlayerAttack脚本中
if(normalAttackTarget != null) //选定目标后,判断距离
{
float distance = Vector3.Distance(transform.position,normalAttackTarget);
if(distance > minPlayerAttackDistance)
{
PlayerMove._instance.SimpleMove(normalAttackTarget.position); //从PlayerMove中调用移动方法
}
else
{
//直接攻击
}
}
其中SimpleMove()函数实现如下