Unity游戏设计与实现学习记录19/11/2

尝试做《unity游戏设计与实现》里的第一个案例已经有一周多了,今天又在图书馆泡了一下午,又学会了一点小东西,记录一下。

今天主要实现的是武士的攻击判定

原案例中用的是怪物团体,而我现在用的是单个怪物,所以基本上是自己摸索出来的,首先在Player也就是武士下添加一个子对象AttackCollider(攻击碰撞体),一个位于武士前方的球形碰撞体,挂上脚本AttackControl,负责用OnTriggerStay()函数检测进入碰撞范围的是否是Oni(怪物),在这里犯了一个弱智的错误:
函数应该是OnTriggerStay(Collider other)打的时候写成了OnTriggerStay(GameOnject other)
导致调试半天也没有任何反应,以后要少犯弱智错误。
进入OnTriggerStay后,首先要判断接受的碰撞体是否为Oni,否break,是则执行碰撞体脚本下的Destory函数,这样可以简单地实现在Player前进过程中将碰到的Oni销毁。

接下来要实现在攻击动画播放时才会判定和销毁“Oni”

这里有两种方式,一种是直接调整AttackCollider是否被激活,使用**GameObject.SetAlive()**方法,
另外一种是使用一个插值判断是否在攻击过程中,这里用第二种方法;

首先在AttackCollider加入一个判定是否能攻击isPowered,添加Power方法以改变isPowered的值,这就涉及到在PlayerControl中判断是否可以攻击了,最初我的想法有些简单,在PlayerControl中有判断在鼠标按下时播放挥剑攻击动画,我想在攻击动画开始时也就是按下攻击键时将isPowered的值改为true,再在循环结束时将isPowered改回false;但Update函数为每帧执行一次,也就是它会在我按下攻击键的一帧中将isPowered改为true,又在该帧结束时改回false,这样只有不到一帧的时间是满足触发条件的。
想通之后,我发现攻击动画播放的整个过程都应该满足触发条件,但我又不知道攻击动画的具体时间,于是我百度到了检查动画播放状态的API:

    public AnimatorStateInfo a;  //在AnimatorStateInfo组件下
    a = animator.GetCurrentAnimatorStateInfo(0);  
    //animator为要查询的动画机对象,后面方法中(为要查询的状态所在层数)
    
    if (a.IsName("attack_r")|| a.IsName("attack_l")) attackControl.Power(true); 
    //"attack_r"和"attack_l"为动画状态的名字而非触发条件的名字
    
    else attackControl.Power(false);

其中我查询到的动画状态机的默认层数应为1,但我的BaseLayer层数为0,以后再具体查一下。
现在就可以实现从动画开始到动画播放结束前都在判定并销毁了。

一个结尾

想着挺多的结果写起来没多少,中间有很多时间浪费在重复的事情上了,还是要细心…

你可能感兴趣的:(游戏学习)