个人项目(3):敌人1
有了主体角色,要实现动作交互以及增加游戏趣味性,就务必要增加敌人。
敌人的行动逻辑
第一种类型敌人(即敌人1)当主角位于其发觉范围之外时并不会做任何行动,当主角位于其发觉范围之内时便会向主角移动,当主角进入其攻击范围时便会发动攻击,该行动逻辑的部分实现代码如下:
Vector3 x=follow.position;
Vector3 y=this.GetComponent<Transform>().position;
float distances=Vector3.Distance(x,y);
if(distances<=maxdistance&&distances>mindistance){//当主体对象位于该对象发觉范围内时
if(musicplaying==true){
as1.Play();
}//脚步声音效播放
musicplaying=false;//音效已在播放
isfighting=false;
movement=this.GetComponent<Transform>().position-follow.position;
movement.x*=-1;
movement.z*=-1;
movement.Normalize();
Animator.SetBool("isrunning",true);
Animator.SetBool("isattacking",false);
}
else if(distances<=mindistance){//当主体对象位于该对象攻击范围内时
as1.Stop();
musicplaying=true;//脚步声音效暂停
isfighting=true;
movement.Set(0.0f,0.0f,0.0f);
Animator.SetBool("isrunning",false);
Animator.SetBool("isattacking",true);
}
else if(distances>maxdistance){//当主体对象位于该对象发觉范围外时
as1.Stop();
musicplaying=true;
movement.Set(0.0f,0.0f,0.0f);
Animator.SetBool("isrunning",false);
Animator.SetBool("isattacking",false);
}
其中的运动与转向方法与主体角色类似,这里就不再赘述。而动画控制器的设计也与主体角色类似,主要是通过调整一些参数的布尔值来实现动画的播放与否。
这里的walking动画并没有应用到,本来是想用于制作一个敌人的AI实现定向巡逻的效果,以后可以再加以完善。
攻击的触发器
本篇我想主要讲一下敌人1攻击时造成主角扣血的触发器逻辑,如图,除了碰撞体(小胶囊)外,我还为该敌人角色添加了一个触发器(大胶囊)。
其中的具体逻辑如下:
private void OnTriggerStay(Collider other){//判断玩家是否处在触发器范围中
if(other.transform==follow&&isfighting==true){
isplayerinrange=true;
}
}
private void OnTriggerExit(Collider other){//判断玩家是否不在或离开触发器范围
if(other.transform==follow){
isplayerinrange=false;
}
}
if(isplayerinrange==true){//触发器触发,主体角色掉血
if(player.invincibility==false){
player.hp--;
player.ishit=true;
}
}
当主体角色为于该攻击范围触发器中并且敌人角色正在攻击,则isplayerinrange布尔值为真,表示主体角色可被攻击,当主体角色不在无敌时间时,就会触发主体角色掉血的逻辑。其中player获取的是为主体角色添加的脚本组件。
当然也可以选择为角色手中的大剑模型添加触发器,具体的实现方法类似,当敌人攻击并打到主体角色是会执行主体角色掉血逻辑。(这里不采用这种方法是因为一开始使用的敌人1模型并没有武器,所以直接添加了一个胶囊体触发器,这里的敌人1模型是将原来敌人1模型的部分组件转移过来的,这也是可以完善的一点。当然后续主体角色的攻击逻辑则是使用了这种方法)。