• 【Unity俯视角射击】我们来做一个《元气骑士》的完整Demo1


    ---------------------------相关功能实现--------------------------------

    1、人物移动

    人物的移动依旧是利用在Update中获取键盘输入的"Horizontal"和"Vertical"的值,在FixedUpdate中更新角色的位置。

    private void Update()

    {

       movement.x = Input.GetAxis("Horizontal");

       movement.y = Input.GetAxis("Vertical");

       if (movement == new Vector2(0, 0)){

          playerAnima.SetBool("run", false);

       }

        else{

            playerAnima.SetBool("run", true);

       }

    }

    private void FixedUpdate(){

        rigidbody.MovePosition(rigidbody.position + movement * moveSpeed * Time.fixedDeltaTime);

    }

    2、人物朝向

    人物朝向其实附带功能还有武器朝向,我写了一个Target字段现在赋值为鼠标位置,有需要也可以修改(比如改为自瞄),考虑到武器种类不同的情况下瞄准方式也会不一样,所以人物的朝向和武器的朝向是各自管理的。


    3、鼠标左键操作逻辑

    这个按键需要判断四种状态:一种是玩家在可互动物体周围时左键操作为“互动”,比如现在做的是捡起枪。另外则是长按、短按和抬起,不同武器在长按、短按、抬起这三个状态下的操作是不一样的。

    为了判断玩家是否在可互动物体的周围,我在Update中每帧由玩家向周围发射射线检测是否碰撞到可互动物体,这里因为只有枪就只做了枪的判断未进一步优化。

    weaponInFloor = null;

    Collider2D[] cols = Physics2D.OverlapCircleAll(transform.position, 1);

    if (cols.Length > 0){

       for (int i = 0; i < cols.Length; i++){

           if (cols[i].CompareTag("Weapon")){

                weaponInFloor = cols[i].gameObject;

           }

        }

    }

    根据射线检测的结果和按键的情况分别执行对应的操作:

    if (weaponInFloor != null && fireKeyDown){

        GetWeapon();

    }

    else{

         if (fireKeyDown){

            if (weapon != null){ weapon.ShootButtonDown(); }

            else{ Debug.Log("没有武器只能手刀撒"); }

         }

         else if(fireKeyPressed){

            if (weapon != null){ weapon.ShootButtonPressed();}

         }

         if(fireKeyUp){

            if (weapon != null){ weapon.ShootButtonUp(); }

         }

    }

    GIF

    武器的拾取需要根据玩家手上是否持有武器做不同动作,相应的武器身上也要有被捡起放下的两个对应方法:

    void GetWeapon(){

        if (weaponInFloor != null){

            //地上有枪就换枪

            if (weapon != null){

                myWeapon.transform.SetParent(GameManager.instance.weaponRecycle);

                weapon.PickDown();

            }

                myWeapon = weaponInFloor;

                weapon = myWeapon.GetComponent();

                weapon.Pickup();

                myWeapon.transform.SetParent(transform);

                myWeapon.transform.localPosition = new Vector3(0, 0, 0);

                myWeapon.transform.localRotation = Quaternion.identity;

                //注册

                weapon.Initialization(gameObject.tag, gameObject.layer);

        }

    }

    不同武器在对应的状态方法中编辑该状态下的操作即可。

    //例:Gun

    public override void ShootButtonDown(){

        if (Time.time - timing >=CD){

            timing = Time.time;

            GameObject bullet = Instantiate(bulletPrefab, pos.position, pos.rotation*Quaternion.AngleAxis(Random.Range(0,shake),Vector3.forward));

            bullet.GetComponent().Initialization(attack, role, bulletForce);

            GetComponent().Play("Shoot");

         }

    }

    public override void ShootButtonPressed(){

         if (Time.time - timing >=CD){

           timing = Time.time;

           GameObject bullet = Instantiate(bulletPrefab, pos.position, pos.rotation*Quaternion.AngleAxis(Random.Range(0,shake),Vector3.forward));

           bullet.GetComponent().Initialization(attack, role, bulletForce);

           GetComponent().Play("Shoot");

          }

    }

    4、镜头跟随

    镜头跟随这块直接用了Cinemachine,跟着马老师的视频设置就可以啦:

    【简明UNITY教程】不用写代码的高级2D摄像机 Cinemachine

    三、凑一个小标题(有感而发)
    由于中间跑去学ShaderGraph再回头看俯视角射击有种恍若隔世的感觉,慢慢找回写代码的状态思路也更清晰了一些,但其实对自己现在写的这个Demo并不是太满意,大概会有漫长的打磨吧。

    同时认识到以前对俯视角射击看得太简单了,又或者说其实我写的确实是俯视角射击,但他离一个完整的游戏还是太远了。还需要更加努力,了解更多同质类型的游戏,也需要学习更多类型的游戏。

  • 相关阅读:
    【Windows版本控制】上海道宁为您提供VisualSVN下载、试用、教程
    pull会使用git merge导致冲突
    阿里云AliGenie开发天猫语音功能-入门篇
    Win11系统Windows.old能删除吗?Windows.old怎么删?
    TCP 加速小记
    拓扑排序板子练习
    Python学习笔记--字符集
    SpringMVC 学习(六)乱码问题
    欢迎 Llama 3:Meta 的新一代开源大语言模型
    如何理解 AnnData ?
  • 原文地址:https://blog.csdn.net/m0_69824302/article/details/127852067