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

您所在的位置:网站首页 元气骑士角色设计 【Unity俯视角射击】我们来做一个《元气骑士》的完整Demo1

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

2024-07-17 06:02| 来源: 网络整理| 查看: 265

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

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并不是太满意,大概会有漫长的打磨吧。

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3