【Unity俯视角射击】我们来做一个《元气骑士》的完整Demo1 |
您所在的位置:网站首页 › 元气骑士角色设计 › 【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并不是太满意,大概会有漫长的打磨吧。 同时认识到以前对俯视角射击看得太简单了,又或者说其实我写的确实是俯视角射击,但他离一个完整的游戏还是太远了。还需要更加努力,了解更多同质类型的游戏,也需要学习更多类型的游戏。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |