个人项目(5):战斗交互与场景搭建

个人项目(5):战斗交互与场景搭建

战斗交互

既然给敌人增加了攻击逻辑,那相对应的也要个主角增加攻击与扣血逻辑。

主角的攻击触发器与敌人1的类似,只是将脚本挂在了主体角色的盾和剑模型中,当剑或盾打到敌人时会执行敌人相应的扣血逻辑。

主角和敌人的扣血逻辑如下:

if (ishit==true)//主角被击打
        {
           as4.Play();
           Animator.Play("TakeDamage01",0,0);
           invincibility=true;
           ishit=false;
           image.fillAmount=hp/hp1;//血条显示
        }
if (ishit==true)//敌人被击打
        {
           invincibility=true;
           ishit=false;
        }

有战斗那就也会有角色死亡,主角死亡逻辑如下:

if(hp<=0){//角色死亡
            Rigidbody.constraints = RigidbodyConstraints.FreezeRotationZ;//消除旋转的X轴约束
            image.fillAmount=0f;
            Animator.SetBool("ismoving",false);
            dead();
            gameend1();
        }
    void dead(){//角色死亡调用的函数
        if(deadtimer<=90){
        deadtimer+=Time.deltaTime;
        end.x=-deadtimer;//主角倒地(不过效果并不理想)
        }
    }

    void gameend1(){//游戏失败
        gamelose.alpha=1;
    }
//敌人脚本
else if(player.hp<=0){//主体角色死亡
           as1.Stop();
           musicplaying=true;
           movement.Set(0.0f,0.0f,0.0f);
           Animator.SetBool("isrunning",false);
           Animator.SetBool("isattacking",false);
       }

当主角死亡时游戏会结束并使场景中所有其他角色暂停行动,结束UI的制作与技能图标的制作类似,也是通过调整已有文字的alpha值进行显示。

image-20220824112053983

敌人死亡逻辑如下:

    else{//当前角色死亡
        as1.Stop();
        musicplaying=true;
        dead();
    }
    
    void dead(){//当前角色死亡调用的函数
        movement.Set(0.0f,0.0f,0.0f);
        Animator.SetBool("isrunning",false);
        Animator.SetBool("isattacking",false);
        this.transform.position=new Vector3(114.4f,2.5f,-127.0f);
        textshow();
    }

    void textshow(){//屏幕左侧敌人死亡UI显示
        if(haveshowed==false){
            Canvas.alpha=1;
            haveshowed=true;
        }
        else if(haveshowed=true){
            if (showTimer>=showTime)
            {
                Canvas.alpha=0;
                haveshowed=false;
                showTimer=0;
                hp=1;
            }
            else if(showTimer<showTime){
                if(Mathf.Abs(Canvas.alpha-((showTime-showTimer)/showTime))<=1e-6){//判断是否在文字消失过程中有新的敌人死亡(即判断是否有其他脚本调用文字消失方法)
                    showTimer+=Time.deltaTime;
                    Canvas.alpha=(showTime-showTimer)/showTime;
                }
                else if(Canvas.alpha>((showTime-showTimer)/showTime)) {
                    haveshowed=false;
                    hp=1;
                }
            }
        }
    }

当敌人死亡时也会有UI交互(因为敌人死亡的效果并不明显),具体方法如上述代码所示,也是通过调整已有图片的alpha值来实现,但是当两个敌人死亡间隔过短时会产生两个脚本同时调用该文字资源的bug,所以当有其他脚本调用时要随时将本脚本的方法调用暂停,具体实现方法是将角色的hp重新设置为1。为什么要将hp重新设置为1?因为我发现我无法通过调整GetComponent().enabled来使角色消失,可能是模型内部的原因(这样也会造成模型消失但碰撞体还在的问题),所以我采用了当敌人死亡时将他们传送到地图边界的方法来使他们消失,所以可以将hp重新设置为1来使该敌人脚本不会再调用文字消失方法。

image-20220824112441798

场景搭建

场景搭建过程较为简单,我们在用ProBuilder搭建的Plane上用Polybrush工具调整好地形起伏,之后再将一些环境预制件(花草树木)添加到适宜的地方,使其符合理想状态即可。之后就可以将主角和敌人添加进场景中了(因为敌人数量往往不止一个,我们可以将做好的敌人制成预制件,从预制件中再将敌人拖入场景,这样可以实现复制粘贴同样的效果,当然我本人更喜欢这种做法)。
image-20220824113602154

猜你喜欢

转载自blog.csdn.net/m0_54119099/article/details/126503406