Unity使用新输入系统InputSystem制作飞机大战Demo(后处理配置、子弹的发射……)

这篇具有很好参考价值的文章主要介绍了Unity使用新输入系统InputSystem制作飞机大战Demo(后处理配置、子弹的发射……)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

unity的新的输入系统的键盘输入,unity,c#,游戏引擎

@作者 : SYFStrive

@博客首页 : HomePage

📌:个人社区(欢迎大佬们加入) 👉:社区链接🔗

📌:觉得文章不错可以点点关注 👉:专栏连接🔗

💃:程序员每天坚持锻炼💪

unity的新的输入系统的键盘输入,unity,c#,游戏引擎
unity的新的输入系统的键盘输入,unity,c#,游戏引擎
unity的新的输入系统的键盘输入,unity,c#,游戏引擎

👉 飞机大战专栏(🔥)

游戏单例脚本

单例模式是1种设计模式:👉(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

单例使用说明:“单例模式是指在内存中只会创建一次对象的设计模式,并且确保一个类只有实例,而且会自行实例化,并向整个系统提供这个实例。

非持久化泛型单例

using UnityEngine;

//摘要:Base class for everything attached to GameObjects.
//Component中文说明:所有能挂载到游戏对象上的类型基类
public class Singleton<T> : MonoBehaviour where T :Component
{
    public static T Instance { get; private set; }

    protected virtual void Awake()
    {
        Instance = this as T;
    }
}

游戏基类

子弹基类实现子弹移动

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Projectile : MonoBehaviour
{
    //子弹的移动速度
    [SerializeField] float moveSpeed;
    //子弹的移动方向
    [SerializeField] protected Vector3 moveDirection;
    //子弹移动的Obj
    protected GameObject targer;
    
    protected virtual void OnEnable()
    {
        StartCoroutine(ProjectileMoveIE());
    }

    IEnumerator ProjectileMoveIE()
    {
        while (true)
        {
            //子弹移动
            transform.position += moveSpeed * moveDirection * Time.deltaTime;
            yield return null;
        }
    }
}

视口限制

窗口如 👇

unity的新的输入系统的键盘输入,unity,c#,游戏引擎

限制视口脚本

说明:因为是工具脚本所以续成范型单例

视口脚本Viewport 如 👇

using UnityEngine;

public class Viewport : Singleton<Viewport>
{
    //限制player的镜头
    private float maxX;
    private float minX;
    private float maxY;
    private float minY;

    private void Start()
    {
        //获取摄像机
        Camera camera = Camera.main;
		
        //屏幕坐标转换为世界坐标   
        Vector2 bottomLeft = camera.ViewportToWorldPoint(Vector3.zero);
        Vector2 topRight = camera.ViewportToWorldPoint(Vector3.one);

        //获取对应的X、Y值
        maxX = topRight.x;
        minX = bottomLeft.x;
        maxY = topRight.y;
        minY = bottomLeft.y;
    }

	/// <summary>
	/// 限制Player的坐标
	/// </summary>
	/// <param name="playerPosition">玩家位置</param>
	/// <param name="paddingX">X的偏移量</param>
	/// <param name="paddingY">Y的偏移量</param>
	/// <returns></returns>
	public Vector3 AstrictPlayerPosition(Vector3 playerPosition,float paddingX,float paddingY)
   {
      //初始位置
      Vector3 intaialPosition = Vector3.zero;

      //Mathf.Clamp参数说明(值,最小值,最大值)
      //paddingX、paddingY 限制飞机一半身体超出视口外偏移量
      intaialPosition.x = Mathf.Clamp(playerPosition.x, minX+ paddingX, maxX- paddingX);
      intaialPosition.y = Mathf.Clamp(playerPosition.y, minY+ paddingY, maxY- paddingY);

      //返回位置
      return intaialPosition;
   }
}

Player脚本

实现共能: 添加系统事件 👉 使系统事件与新输入系统绑定

添加代码如 👇

using UnityEngine;
//运行时自动添加Rigidbody组件
[RequireComponent(typeof(Rigidbody2D))]
public class Player : MonoBehaviour
{	

  	[Header("---Input---")]
    [SerializeField]PlayerInput playerInput;

    //获取刚体
    private new Rigidbody2D rigidbody;

	[Header("---Move---")]
    //移动的速度
    [SerializeField] float moveSpeed=10;
    
    //限制飞机的一半身体超出视口
    float paddingX;
    float paddingY;

    private void Awake()
    {
        //获取刚体组件
        rigidbody=GetComponent<Rigidbody2D>();    
    }
    private void Start()
    {
        //初始化重力为0
        rigidbody.gravityScale = 0f;
        //初始化激活动作表
        playerInput.AstrictImport();
        
    //玩家的尺度
    //GetComponent<MeshFilter>().sharedMesh.bounds.size获得的是未经缩放的大小。
    //GetComponent<Renderer>().bounds.size获得是是经过缩放后的大小。
    var size = transform.GetChild(0).GetComponent<Renderer>().bounds.size;
    paddingX = size.x / 2;
    paddingY = size.y / 2;
    }

    private void OnEnable()
    {
        //订阅事件
        playerInput.onMove += Move;
        playerInput.onStopMove += StopMove;
    }

    private void OnDisable()
    {
        //移除事件
        playerInput.onMove -= Move;
        playerInput.onStopMove -= StopMove;
    }

    /// <summary>
    /// 移动
    /// </summary>
    private void Move(Vector2 moveInput)
    {
        //好理解先接受移动的值
        var moveSpeedS = moveInput * moveSpeed;
        //刚体移动
        rigidbody.velocity= moveSpeedS;
    }

    /// <summary>
    /// 停止移动
    /// </summary>
    private void StopMove()
    {
        //刚体移动
        rigidbody.velocity = Vector3.zero;
	    //停止携程(限制范围)
	    StopCoroutine("AstrictPlayerPositionIE");
    }

	/// <summary>
	/// 移动
	/// </summary>
	private void Move(Vector2 moveInput)
	{
	    //好理解先接受移动的值
	    var moveSpeedS = moveInput * moveSpeed;
	    //刚体移动
	    rigidbody.velocity= moveSpeedS;
	    //开启携程(限制范围)
	    StartCoroutine("AstrictPlayerPositionIE");
	}
	
	//限制飞机的位置 方法:1、可以在Update调用(消耗性能的神) 2、可以在携程调用(这里使用携程)
	IEnumerator AstrictPlayerPositionIE()
	{
	    while (true)
	    {
	        transform.position = Viewport.Instance.AstrictPlayerPosition(transform.position, paddingX, paddingY);
	
	        yield return null;
	    }
	}
}

效果

效果如 👇

unity的新的输入系统的键盘输入,unity,c#,游戏引擎

实现玩家的加速与减速携程

配置输入设备的手感

unity的新的输入系统的键盘输入,unity,c#,游戏引擎

Player脚本

实现共能: 实现加速与减速携程

添加代码如 👇

using UnityEngine;
//运行时自动添加Rigidbody组件
[RequireComponent(typeof(Rigidbody2D))]
public class Player : MonoBehaviour
{
  	[Header("---Input---")]
    [SerializeField]PlayerInput playerInput;

    //获取刚体
    private new Rigidbody2D rigidbody;

	  [Header("---Move---")]
	  //移动的速度
	  [SerializeField] float moveSpeed = 10;
	  //限制飞机的一半身体超出视口
	  float paddingX;
	  float paddingY;
	  //飞机的加速与减速时间
	  [SerializeField] float speedUpTime = 3;
	  [SerializeField] float speedCutTime = 3;
	  //飞机移动旋转的角度
	  [SerializeField] float playerMoveRosition = 10;
	  //防止被刚体碰到短暂停止BUG
	  private Vector2 moveDirection;
	  //玩家移动旋转的初始化值 防止频繁触发GC
	  private float t;
	  private Vector2 moveVelocity;
	  private Quaternion moveQuaternion;
	  private WaitForFixedUpdate moveWaitForFixedUpdate = new WaitForFixedUpdate();

	  [Header("---停止待参数的携程---")]
	  
	  //停止携程的第三种方法
	  private Coroutine moveCoroutine;
	  private Coroutine relfRecoverCoroutine;



    private void Awake()
    {
        //获取刚体组件
        rigidbody=GetComponent<Rigidbody2D>();    
    }
    private void Start()
    {
        //初始化重力为0
        rigidbody.gravityScale = 0f;
        //初始化激活动作表
        playerInput.AstrictImport();
	    //视口的尺度
	    //GetComponent<MeshFilter>().sharedMesh.bounds.size获得的是未经缩放的大小。
	    //GetComponent<Renderer>().bounds.size获得是是经过缩放后的大小。
	    var size = transform.GetChild(0).GetComponent<Renderer>().bounds.size;
	    paddingX = size.x / 2;
	    paddingY = size.y / 2;
    }

    private void OnEnable()
    {
        //订阅事件
        playerInput.onMove += Move;
        playerInput.onStopMove += StopMove;
    }

    private void OnDisable()
    {
        //移除事件
        playerInput.onMove -= Move;
        playerInput.onStopMove -= StopMove;
    }

	  #region Move
	  /// <summary>
	  /// 玩家移动
	  /// </summary>
	  private void Move(Vector2 moveInput)
	  {
	    //再次移动前应该停止之前的携程(使用第三种参数停止携程)
	    if (moveCoroutine != null)
	      StopCoroutine(moveCoroutine);
	
	    好理解先接受移动的值
	    //var moveSpeedS = moveInput * moveSpeed;
	    刚体移动
	    //rigidbody.velocity= moveSpeedS;
	
	    //移动的初始值
	    moveDirection = moveInput.normalized;
	    //获取旋转的值
	    Quaternion moveRosition = Quaternion.AngleAxis(playerMoveRosition * moveInput.y, Vector3.right);
	    //开启携程(限制加速减速)
	    moveCoroutine = StartCoroutine(PlayerMoveCoroutine(speedUpTime, moveDirection * moveSpeed, moveRosition));
	    //开启携程(限制范围)
	    stopMoveCoroutine = StartCoroutine(nameof(AstrictPlayerPositionIE));
	  }
	
	  /// <summary>
	  /// 停止移动
	  /// </summary>
	  private void StopMove()
	  {
	    //再次移动前应该停止之前的携程(使用第三种参数停止携程)
	    if (moveCoroutine != null)
	      StopCoroutine(moveCoroutine);
	
	    刚体移动
	    //rigidbody.velocity = Vector3.zero;
	
	    //停止携程(限制加速减速)
	    moveDirection = Vector3.zero;
	    moveCoroutine = StartCoroutine(PlayerMoveCoroutine(speedCutTime, moveDirection, Quaternion.identity));
	
	    //停止携程(限制范围)
	    StopCoroutine(stopMoveCoroutine);
	  }


	//限制飞机的位置 方法:1、可以在Update调用(消耗性能的神) 2、可以在携程调用(这里使用携程)
	IEnumerator AstrictPlayerPositionIE()
	{
	    while (true)
	    {
	        transform.position = Viewport.Instance.AstrictPlayerPosition(transform.position, paddingX, paddingY);
	
	        yield return null;
	    }
	}
	
	
	/// <summary>
	/// 加速与减速携程
	/// </summary>
	/// <param name="time">加速的时间</param>
	/// <param name="moveTarget">移动的目标位置</param>
	/// <param name="rositionTarget">旋转的目标位置</param>
	/// <returns></returns>
	IEnumerator PlayerMoveCoroutine(float time, Vector2 moveTarget, Quaternion rositionTarget)
	{
	  t = 0f;
	  //初始化移动速度
	  moveVelocity = rigidbody.velocity;
	  //初始化旋转角度
	  moveQuaternion = transform.rotation;
	
	  while (t < 1f)
	  {
	    t += Time.fixedDeltaTime / time;
	
	    //lerp移动体验极佳手感
	    rigidbody.velocity = Vector2.Lerp(moveVelocity, moveTarget, t);
	
	    //玩家移动旋转
	    transform.rotation = Quaternion.Lerp(moveQuaternion, rositionTarget, t);
	
	    //空返回
	    yield return moveWaitForFixedUpdate;
	  }
	}
	#endregion

	  /// <summary>
	  /// 停止移动
	  /// </summary>
	  private void StopMove()
	  {
	    //再次移动前应该停止之前的携程(使用第三种参数停止携程)
	    if (moveCoroutine != null)
	      StopCoroutine(moveCoroutine);
	      
	    刚体移动
	    //rigidbody.velocity = Vector3.zero;
	
	    刚体移动
	    //rigidbody.velocity = Vector3.zero;
	
	    //停止携程(限制加速减速)
	    moveDirection = Vector3.zero;
	    moveCoroutine = StartCoroutine(PlayerMoveCoroutine(speedCutTime, moveDirection, Quaternion.identity));
	
	    //停止携程(限制范围)
	    StopCoroutine(stopMoveCoroutine);
	  }
}

效果

unity的新的输入系统的键盘输入,unity,c#,游戏引擎

UPR添加配置后处理

  1. 使用了Unity的后处理插件Post-Processing。
  2. 该插件十分强大,能增强画面真实感,产生发光效果,进行调色等。使用也很简单,调节一下参数即可。
  3. 后处理 (Post-Processing) 是全屏图像处理效果的通用术语,它发生在摄像机绘制场景之后,但场景在屏幕上呈现之前。后期处理可以大大改善您的产品的视觉效果,只需很少的设置时间。您可以使用后期处理效果来模拟物理相机和胶片的属性。

相机处理如 👇

unity的新的输入系统的键盘输入,unity,c#,游戏引擎

添加后处理效果

unity的新的输入系统的键盘输入,unity,c#,游戏引擎

局部处理及全局处理效果(项目用的是全局处理)

说明:当主摄像机碰到局部Volume对象的碰撞体后就会应用这个局部的镜头变形效果。

使用场景:水波纹等效果。

后处理参数如 👇

unity的新的输入系统的键盘输入,unity,c#,游戏引擎

unity的新的输入系统的键盘输入,unity,c#,游戏引擎

效果

unity的新的输入系统的键盘输入,unity,c#,游戏引擎

子弹配置

子弹拖尾效果配置

unity的新的输入系统的键盘输入,unity,c#,游戏引擎

unity的新的输入系统的键盘输入,unity,c#,游戏引擎

unity的新的输入系统的键盘输入,unity,c#,游戏引擎

效果

unity的新的输入系统的键盘输入,unity,c#,游戏引擎

实现玩家发射子弹

玩家子类子弹

实现:每按下时发射子弹

using UnityEngine;
public class PlayerProjectile : Projectile
{

}

Player脚本

public class Player : MonoBehaviour
{
	  [Header("---Fire---")]
	  //子弹的预制体
	  [SerializeField] GameObject ProjectileTOP90;
	  [SerializeField] GameObject ProjectileTOP;
	  [SerializeField] GameObject ProjectileCenter;
	  [SerializeField] GameObject ProjectileDown;
	  [SerializeField] GameObject ProjectileDown90;
	
	  //子弹模式
	  [SerializeField, Range(0, 4)] int attackPattern = 0;
	
	  //发射的位置
	  [SerializeField] Transform fireTranPosTop90;
	  [SerializeField] Transform fireTranPosCenter;
	  [SerializeField] Transform fireTranPosTop;
	  [SerializeField] Transform fireTranPosDown;
	  [SerializeField] Transform fireTranPosDown90;
		
	  //发射子弹的间隔
	  [SerializeField] float fireTime = 0.3f;
	  //发射子弹间隔携程
	  WaitForSeconds fireProjectileTimeIE;
	  //生命自动恢复的间隔携程
	  WaitForSeconds selfRecoverTimeIE;
	  //使用技能下的开火时间携程
	  WaitForSeconds areSkillFireProjectileTimeIE;

  //发射子弹携程
  IEnumerator FireProjectileIE()
  {
    //创建预制体
    while (true)
    {
	  Instantiate(projectile1, fireTranPosCenter.position, Quaternion.identity);
		
      //协程间隔 👉 判断是否是仅能子弹
      yield return isEnetgySkill ? areSkillFireProjectileTimeIE : fireProjectileTimeIE;
	}
  }
}

子弹的销毁或隐藏共能ProjectileDestroy

ProjectileDestroy 实现如 👇

using System.Collections;
using UnityEngine;

public class ProjectileDestroy : MonoBehaviour
{
  //删除或隐藏的间隔时间
  [SerializeField] float destroyTimer=1.3f;
  //是否删除
  [SerializeField] bool isDestroy;
  //删除的子弹的间隔携程
  [SerializeField] WaitForSeconds destroyTime;

  private void Awake()
  {
    //初始化
    destroyTime = new WaitForSeconds(destroyTimer);
  }
  private void OnEnable()
  {
    //显示时执行携程
    StartCoroutine(DestroyProjectile()); 
  }


  IEnumerator DestroyProjectile()
  {
    yield return destroyTime;

    if (isDestroy)
    {
      Destroy(gameObject);
    }
    else
    {
      gameObject.SetActive(false);
    }
  }
}

效果

unity的新的输入系统的键盘输入,unity,c#,游戏引擎

最后

unity的新的输入系统的键盘输入,unity,c#,游戏引擎
本文到这里就结束了,大佬们的支持是我持续更新的最大动力,希望这篇文章能帮到大家💪

 

                 相关专栏连接🔗
unity的新的输入系统的键盘输入,unity,c#,游戏引擎

下篇文章再见ヾ( ̄▽ ̄)ByeBye

unity的新的输入系统的键盘输入,unity,c#,游戏引擎文章来源地址https://www.toymoban.com/news/detail-816153.html

到了这里,关于Unity使用新输入系统InputSystem制作飞机大战Demo(后处理配置、子弹的发射……)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity全新的输入系统InputSystem

    在Unity中,默认使用的是旧的输入管理器(InputSystemOld) 在脚本中,利用Input类可以获得用户的输入操作,以及访问移动设备的多点触控或加速感应数据,Input类可以读取输入管理器中设置的按键,在Updata函数中监测用户的输入。 1.虚拟轴 在项目设置中可以看到虚拟轴的相关设

    2024年02月05日
    浏览(54)
  • Unity之新版输入系统InputSystem入门

    最近Unity版本全面升级到Unity2021了,着色器也全面使用URP,接下来毫无疑问,输入系统也要全面升级InputSystem,这也是Unity官方希望我们做的,毕竟现在都2023年了,我们的技术是需要跟上时代的步伐。 老版本的InputSysten系统,其实就一个Input静态类,官方给我们预定了一些常用

    2024年02月16日
    浏览(43)
  • Unity之新版输入系统InputSystem如何自定义InputActions

    上一篇文章,我们介绍了如何使用新版本的InputSystem,我们知道了InputActionsAsset给我们提供了更多的灵活性,扩展性和复用性。那么这篇文章我们就来介绍一下如何创建自定义InputActionAsset Input Action Asset 包含输入 Actions及其关联的Bindings和Control Schemes 的资源。这些资源文件扩展

    2024年02月11日
    浏览(54)
  • python---简单游戏制作(飞机大战)

    1.开发软件 pycharm 编程软件 pygame 第三方库 sprite Group 2.技术介绍      pycharm: PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制。此外,该IDE提供

    2024年02月12日
    浏览(48)
  • 回忆童年游戏,完美利用Python制作飞机大战(爷青回~)

    名字:阿玥的小东东 学习:python、C/C++ 博客链接:阿玥的小东东的博客_CSDN博客-pythonc++高级知识,过年必备,C/C++知识讲解领域博主 目录 pygame包的安装 添加python环境变量 创建飞机大战窗口 飞机照片

    2024年02月08日
    浏览(41)
  • 【python】 pygame学习示例 --飞机大战小游戏制作

    python版本:3.8.5 所需模块:pygame random os pygame版本:20.1 开发环境:pycharm专业版 硬件环境:win11 8G内存以上 使用python的第三方库–pygame 制作飞机大战小游戏 小游戏的内容包括: 玩家player的移动 子弹的发射 陨石的随机掉落(包括旋转 大小 下落角度) 玩家 子弹 陨石的碰撞交互

    2024年02月04日
    浏览(55)
  • Unity简单操作:InputSystem获取WASD键盘输入 移动人物

      目录 安装InputSystem  在编辑的脚本中使用 InputSystem生成的脚本 Unity版本:2019.2.3f1 菜单栏/Window/Package Manager/Input System  工程面板内 右键--创建Input Actions   选中New Controls改名为PlayerControls 然后属性 面板按下Edit asset  Action Maps添加:PlayerMovement   Actions添加:New action 改名为

    2024年02月16日
    浏览(38)
  • javascript打飞机程序8x8x飞机大战js打飞机程序,飞机大战知识点包含了JavaScript面向过程的全部知识点,包括变量、运算符、判断、循环、数组、自定义函数、系统函数、事件等。...

    讲解了JavaScript编程语言制作游戏界面,添加游戏控制、制作元素动画、制作多元素场景,添加碰撞功能、制作精灵动画等功能 源码如下: html:

    2024年02月16日
    浏览(66)
  • unity制作简单的植物大战僵尸

    简单制作植物大战僵尸游戏。 协程实现各种相机动画 卡片填充方式修改为:“已填充”,实现植物恢复 事件系统实现拖拽植物 植物子弹实现对象池 这段代码是一个Unity游戏中的太阳类(Sun),实现了天上掉落的太阳落下的功能。具体实现如下: isSkySun:bool 类型的变量,用

    2024年02月05日
    浏览(46)
  • 我的第一个NPM包:panghu-planebattle-esm(胖虎飞机大战)使用说明

    好家伙,我的包终于开发完啦   欢迎使用胖虎的飞机大战包!! 为你的主页添加色彩 这是一个有趣的网页小游戏包,使用canvas和js开发 使用ES6模块化开发 效果图如下:  (觉得图片太sb的可以自己改) 代码已开源!! Git: https://gitee.com/tang-and-han-dynasties/panghu-planebattle-esm.git NPM: panghu-pla

    2023年04月19日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包