当前位置:   article > 正文

【Unity2D好项目分享】用全是好活制作横版卷轴射击游戏①简单制作滚动卷轴以及玩家移动_unity 横板射击类游戏

unity 横板射击类游戏

B站完整视频:【完结】Unity横版卷轴射击游戏制作教程 【满满的全是干货】 独立游戏 | 游戏开发_哔哩哔哩_bilibili➤内容简介 -- Unity游戏制作要领- 从无到有制作一个完整游戏的全过程- 输入系统(Input System)- 对象池 (Objejct Pooling)- 物品掉落 (Item Loot)- 协程 (Coroutine)- 适合有一定Unity游戏开发基础的同学继续深入学习---------------------------------➤资源包 / 脚本源码 - - GitHub -icon-default.png?t=N7T8https://www.bilibili.com/video/BV1SB4y1w7VY?p=4&spm_id_from=333.851.header_right.history_list.click

资源包/源码:

https://github.com/AtCloudStudio/SaveSystemTutorialicon-default.png?t=N7T8https://github.com/AtCloudStudio/SaveSystemTutorialUnity 横版卷轴射击游戏 制作教程: Unity 横版卷轴射击游戏 制作教程icon-default.png?t=N7T8https://gitee.com/ryanindiedev/ShootingStarPackages今天在B站上看到一个非常厉害的游戏制作者,如他视频内容上说的,作者将从零开始带我们制作一个完整的横版卷轴设计游戏(12个小时),在学习了前五P后本人就先将所学到的内容总结一下。

学习目标:

   学习简单制作滚动卷轴以及玩家移动,首先先打开我们的Hub,创建一个新项目,版本按老师说要在2020.3.2以上,然后项目选择UPR(通用渲染管道模式)创建好以后点进去,设置好前期工作,先把场景中自带的案例删除,然后把文件保留到只剩这几个

然后打开Package Manager删除不需要的插件

(Input System是后续要安装的,这里有没有无所谓) 

然后打开我们已经下载好的资源包,把我重点标记的Shooting Star Tutorial 01导入素材

拖进Unity后点击Import,我们的前期工作就算完成了。 


学习内容:

  创建一个Scene,点进去后新场景就只有Main Camera和Direction Light,我们将Prefab上自带的战机拖上去HIerachy面板上然后改名加Player

  

然后为了让场景更亮一些,我们Crtl+ D复制多一个Directional Light (1)更改它的颜色和强度

  

然后更改摄像机的正交,更改它的投影模式,而且摄像机有个能够渲染URP的脚本

 接着我们制作一个简易的滚动窗口,新创建一个3D Object -> Quad,然后根据背景图片的大小更改它的大小,但同时也要让背景充满摄像机

Crtl + D复制多一份背景,类型改为Default

创建一个材质SimpleBackground更改参数并把刚复制的背景拖进来

 新建一个脚本BackgroundScroller.cs然后通过更改材质的Offset来实现持续背景滚动

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class BackgroundScroller : MonoBehaviour
  5. {
  6. [SerializeField] Vector2 scrollingVelocity;
  7. Material material;
  8. void Start()
  9. {
  10. material = GetComponent<Renderer>().material;
  11. }
  12. // Update is called once per frame
  13. void Update()
  14. {
  15. material.mainTextureOffset += scrollingVelocity * Time.deltaTime;
  16. }
  17. }

运行后发现背景可以滚动了


制作玩家内容:

如果说前面的内容你都已经会做了(看我前面的文章都知道的),那么接下来才是我没学过的,首先先去Package Manager上下载Input Systems(直接搜索框搜索)

然后还要检查是否是最新版本

下载成功后在我们的Setting文件夹新建一个Input Actions(最下角)

创建好后点进去首先我们先看这一行Action Maps动作表,这个是告诉我们创建这个动作表可以包含各种动作,我们可以创建多个动作表比如用于游戏操作,菜单选择,这里我们创建一个动作表GamePlay,然后我们创建不同类型的动作,对于键盘的要选择第二个那个包含上下左右的

更改Path的时候我们可以点击Listen他就可以监听我们输入的键盘,例如我点击Listen后按了一下W就会被监听到

接着我们点回我们创建的Input Actions然后会发现它的面板上能生成一个C#脚本勾选后点击Apply

它为我们生成了一个Input Actions,这里要学会分类管理,生成的脚本看上去很复杂,其实上面的都不用理解,看最下面的接口,才是我们要实现的

然后我们创建一个PlayerInput.cs的脚本

涉及到事件,委托,泛型

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.InputSystem;
  5. using UnityEngine.Events;
  6. [CreateAssetMenu(menuName ="Player Input")]
  7. public class PlayerInput : ScriptableObject,InputActions.IGamePlayActions //继承我们的IGamePlayActions接口
  8. {
  9. public event UnityAction<Vector2> onMove = delegate { }; //添加Unity自带的动作事件
  10. public event UnityAction onStopMove = delegate { };//添加Unity自带的动作事件
  11. InputActions inputActions;
  12. private void OnEnable()
  13. {
  14. inputActions = new InputActions();
  15. inputActions.GamePlay.SetCallbacks(this); //每次添加新的动作表都要在这里登记它的新的回调函数,这里我们只有一个GamePlay动作表
  16. }
  17. private void OnDisable()
  18. {
  19. DisableAllInput();
  20. }
  21. public void DisableAllInput()
  22. {
  23. inputActions.GamePlay.Disable(); //禁用动作表
  24. }
  25. public void EnableGamePlay()
  26. {
  27. inputActions.GamePlay.Enable(); //允许使用动作表
  28. Cursor.visible = false;
  29. Cursor.lockState = CursorLockMode.Locked; //隐藏+锁定鼠标
  30. }
  31. public void OnMove(InputAction.CallbackContext context)
  32. {
  33. if(context.phase == InputActionPhase.Performed) //相当于InputSystems的GetKey
  34. {
  35. if (onMove != null) //确认事件不为空
  36. {
  37. onMove.Invoke(context.ReadValue<Vector2>());
  38. }
  39. }
  40. if(context.phase == InputActionPhase.Canceled) //相当于InputSystems的GetKeyUp
  41. {
  42. if (onStopMove != null)
  43. {
  44. onStopMove.Invoke();
  45. }
  46. }
  47. }
  48. }

需要说明的是,InputSystem用InputActionPhase取代了Input类的而且这里有五种情况

 回到Project面板后,创建一个PlayerInput

然后再创建一个玩家的总类Player,

首先先为PlayerInput添加委托,然后我们创建协成用来实现Player移动的加减速,为了防止游戏中出现明明已经停止键盘输入但玩家仍在加速的Bug,我们需要在停止输入的时候暂停调用协成,用插值函数来实现加减速以及战机X轴的左右旋转。

  1. using System.Collections;
  2. using UnityEngine;
  3. [RequireComponent(typeof(Rigidbody2D))]
  4. public class Player : MonoBehaviour
  5. {
  6. [SerializeField] PlayerInput input;
  7. [SerializeField] float accelarationTime = 3f;
  8. [SerializeField] float decelarationTime = 3f;
  9. [SerializeField] float moveSpeed = 10f;
  10. [SerializeField] float moveRotatinAngle = 50f;
  11. [SerializeField] float paddingX = 0.2f;
  12. [SerializeField] float paddingY = 0.2f;
  13. Rigidbody2D rigi2D;
  14. Coroutine moveCoroutine;
  15. private void Awake()
  16. {
  17. rigi2D = GetComponent<Rigidbody2D>();
  18. }
  19. private void OnEnable()
  20. {
  21. //增加委托
  22. input.onMove += Move;
  23. input.onStopMove += StopMove;
  24. }
  25. private void OnDisable()
  26. {
  27. //取消委托
  28. input.onMove -= Move;
  29. input.onStopMove -= StopMove;
  30. }
  31. void Start()
  32. {
  33. rigi2D.gravityScale = 0f;
  34. input.EnableGamePlay(); //激活动作表
  35. }
  36. void Move(Vector2 moveInput) //就是你输入信号的二维值
  37. {
  38. //Vector2 moveAmount = moveInput * moveSpeed;
  39. //rigi2D.velocity = moveAmount;
  40. if (moveCoroutine != null)
  41. {
  42. StopCoroutine(moveCoroutine);
  43. }
  44. Quaternion moveRotation = Quaternion.AngleAxis(moveRotatinAngle * moveInput.y,Vector3.right); //right即红色的X轴,初始旋转角度
  45. moveCoroutine=StartCoroutine(MoveCoroutine(accelarationTime,(moveInput.normalized * moveSpeed),moveRotation));
  46. StartCoroutine(MovePositionLimitCoroutine());
  47. }
  48. void StopMove()
  49. {
  50. //rigi2D.velocity = Vector2.zero;
  51. if (moveCoroutine != null)
  52. {
  53. StopCoroutine(moveCoroutine);
  54. }
  55. moveCoroutine = StartCoroutine(MoveCoroutine(decelarationTime,Vector2.zero, Quaternion.identity));
  56. StopCoroutine(MovePositionLimitCoroutine());
  57. }
  58. IEnumerator MoveCoroutine(float time,Vector2 moveVelocity,Quaternion moveRotation)
  59. {
  60. float t = 0f;
  61. while(t< time)
  62. {
  63. t += Time.fixedDeltaTime / time;
  64. rigi2D.velocity = Vector2.Lerp(rigi2D.velocity, moveVelocity, t / time);
  65. transform.rotation = Quaternion.Lerp(transform.rotation, moveRotation, t / time);
  66. yield return null;
  67. }
  68. }
  69. IEnumerator MovePositionLimitCoroutine()
  70. {
  71. while (true)
  72. {
  73. transform.position = ViewPort.Instance.PlayerMoveablePosition(transform.position,paddingX,paddingY);
  74. yield return null;
  75. }
  76. }
  77. }

 然后我们还需要控制玩家移动到视域之外,首先我们要先创建一个单例模式的总类,方便我们后续其它组件继承它

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class Singleton<T> : MonoBehaviour where T : Component //约定泛型类型必须是Component
  5. {
  6. public static T Instance { get; private set; } //声明一个只读类型的单例
  7. protected virtual void Awake()
  8. {
  9. Instance = this as T;
  10. }
  11. }

然后创建一个ViewPort.cs的脚本并把它挂载给Environment上

  1. using UnityEngine;
  2. public class ViewPort : Singleton<ViewPort>
  3. {
  4. float minX, maxX;
  5. float minY, maxY;
  6. private void Start()
  7. {
  8. Camera mainCam = Camera.main;
  9. //将视域坐标(1,1)转化为摄像机的世界坐标(1920,1080)
  10. Vector2 bottomLeft = mainCam.ViewportToWorldPoint(new Vector3(0f, 0f));
  11. Vector2 topRight = mainCam.ViewportToWorldPoint(new Vector3(1f, 1f));
  12. minX = bottomLeft.x;
  13. minY = bottomLeft.y;
  14. maxX = topRight.x;
  15. maxY = topRight.y;
  16. }
  17. //玩家可移动位置
  18. public Vector3 PlayerMoveablePosition(Vector3 playerPosition,float paddingX,float paddingY)
  19. {
  20. Vector3 position = Vector3.zero;
  21. position.x = Mathf.Clamp(playerPosition.x, minX+paddingX, maxX-paddingX);
  22. position.y = Mathf.Clamp(playerPosition.y, minY+paddingY, maxY-paddingY);
  23. return position;
  24. }
  25. }

其中PaddingX和PaddingY指的是即使我们限制后战机仍然会有超出屏幕外的部分,min就加上这段距离,max就减去这段距离就好,

别忘了给Player设置好参数,rigibody2D的gravity scale要改成0不然就会掉下去

最后我们打开Input Manager Package,把UpdateMode改为FixedUpdate保证再不同的设备中能稳定的帧率运行(1秒50帧),并把支持设备设置为键盘鼠标摇杆


学习产出:

可见战机能发生旋转,有加减速度,屏幕滚动,且不会超出我们的视域范围 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/770487
推荐阅读
相关标签
  

闽ICP备14008679号