​

Introduction

原理:

角色位置改变时,每隔一段时间记录角色的位置,然后在记录的位置上放置一个图片,在图片出现之后过一段时间就让图片渐渐消失

简述实现步骤:

1.在Unity中Create Empty(空物体),在其下面放置角色的图片

​编辑

2.写代码

3.测试,修复Bug

最终效果:

Dash and SpeedUp

PlayerDash.cs(脚本挂在player上面)

变量声明

    [Header("Player")]
private SpriteRenderer playerSr;
private Rigidbody2D rb;
private Vector2 movement = Vector2.zero; public float spriteRate = 0.02f; [Header("UpgradeSpeed")]
public float upSpeed = 5f;
public float upSpeedTime = 5f;
public float spriteUpSpeedRate = 0.25f;
private bool isUpSpeeding = false;
private GameObject[] spritePoolSpeedUp;
private float upCounter = 0; [Header("Dash")]
public float dashTime = 0.1f;
public float dashSpeed = 20f;
public float dashRate = 2f;
private Vector2 dir= Vector2.zero;
private bool isDashing = false;
private float dashRateCounter = 0f;
private GameObject[] spritePoolDash;
private float couter = 0f;

Awake()

private void Awake()
{
rb = GetComponent<Rigidbody2D>();
playerSr = GetComponent<SpriteRenderer>(); //找到Hierarchy面板中放置Dash图片的空物体
Transform dashPool = GameObject.Find("SpritePoolDash").transform;
spritePoolDash = new GameObject[dashPool.childCount];
for (int i = 0; i < spritePoolDash.Length; i++)
{
spritePoolDash[i] = dashPool.GetChild(i).gameObject;
} //找到Hierarchy面板中放置SpeedUp图片的空物体
Transform speedUpPool = GameObject.Find("SpritePoolSpeedUp").transform;
spritePoolSpeedUp = new GameObject[speedUpPool.childCount];
for (int i = 0; i < spritePoolSpeedUp.Length; i++)
{
spritePoolSpeedUp[i] = speedUpPool.GetChild(i).gameObject;
}
}

Update()

private void Update()
{
movement.x = Input.GetAxisRaw("Horizontal");
movement.y = Input.GetAxisRaw("Vertical"); //如果冷却时间 > 0,开始冷却倒计时
if (dashRateCounter > 0)
{
dashRateCounter -= Time.deltaTime;
} //按下空格键,并且角色正在移动,Dash
if (Input.GetKeyDown(KeyCode.Space) && movement != Vector2.zero)
{
//如果正在Dash 或 SpeedUp 或 Dash技能的冷却时间 > 0,则不执行Dash方法
if (isDashing || isUpSpeeding || dashRateCounter > 0)
return;
dir = movement.normalized * 5;
StartCoroutine(Dash());
}
//按下“B”键,SpeedUp
if (Input.GetKeyDown(KeyCode.B))
{
if (isDashing || isUpSpeeding)
return;
StartCoroutine(UpGradeSpeed());
}
}

Dash部分

private IEnumerator Dash()
{
//重置冷却计时器
dashRateCounter = dashRate; //图片出现时间间隔
spriteRate = 0.02f;
//
StartCoroutine(DashSprites()); couter = 0;
//记录player当前的状态,正在冲刺,不可以进行其他技能的操作
isDashing = true; while (couter <= dashTime)
{
couter += Time.deltaTime; //角色朝着按键方向Dash
rb.position = Vector2.MoveTowards(rb.position, rb.position + dir, dashSpeed * Time.deltaTime);
if (couter > dashTime)
{
isDashing = false;
}
yield return null;
}
}
//放置图片
private IEnumerator DashSprites()
{
for (int i = 0; i < spritePool.Length; i++)
{
//将图片设为可见
spritePool[i].SetActive(true);
//重置图片的颜色(其实是重置其透明度,重置alpha为255)
spritePool[i].GetComponent<SpriteRenderer>().color = Color.white;
//设置图片的朝向,与角色图片的朝向一致
spritePool[i].GetComponent<SpriteRenderer>().flipX = playerSr.flipX;
//在角色当前的位置上放置一张图片
spritePool[i].transform.position = transform.position;
//相隔0.02秒放置一张
yield return new WaitForSeconds(spriteRate);
}
}

SpeedUp部分

private IEnumerator UpGradeSpeed()
{
//修改图片出现的时间间隔
spriteRate = 0.25f; isUpSpeeding = true;
StartCoroutine(UpSpeedSprites()); //设置一个计时器
upCounter = upSpeedTime; while (upCounter >= 0f)
{
//计时器>=0就让其倒计时
upCounter -= Time.deltaTime; rb.position = Vector2.MoveTowards(rb.position, rb.position + movement, upSpeed * Time.deltaTime); //SpeedUp结束
if (upCounter <= 0)
{
isUpSpeeding = false;
}
yield return null;
}
} private IEnumerator UpSpeedSprites()
{
for (int i = 0; i < spritePoolUpSpeed.Length; i++)
{
spritePoolUpSpeed[i].SetActive(true);
spritePoolUpSpeed[i].GetComponent<SpriteRenderer>().color = Color.white;
spritePoolUpSpeed[i].GetComponent<SpriteRenderer>().flipX = playerSr.flipX; spritePoolUpSpeed[i].transform.position = transform.position; yield return new WaitForSeconds(spriteRate);
}
}

SpriteFade.cs(脚本挂在以下物体上面)

​编辑

using System.Collections;
using UnityEngine; public class SpriteFade : MonoBehaviour
{
//图片从 不透明 到 透明 的速率
public float spriteFadeTime = 0.01f;
//获取脚本所挂在的物体的图片的SpriteRenderer,用来改变其颜色
private SpriteRenderer sr; private void Awake()
{
sr = GetComponent<SpriteRenderer>();
} private void Update()
{
//如果图片在Hierarchy面板上面显示(表示触发了Dash技能,图片出现了)
if (gameObject.activeInHierarchy)
{
StartCoroutine(FadeSprite());
}
} private IEnumerator FadeSprite()
{
while (gameObject.activeInHierarchy)
{
//渐渐消失
sr.color = Color.Lerp(sr.color, Color.clear, spriteFadeTime * Time.deltaTime);
//消失之后,将图片隐藏
if(sr.color == Color.clear)
{
gameObject.SetActive(false);
}
//每帧执行
yield return null;
} }
}

​

Unity2D-Dash && SpeedUp的更多相关文章

  1. Dash文档制作教程

    前言 什么是Dash 面向程序员的文档库(Mac) 代码片段管理工具 这是强烈推荐给每天在各种API文档中摸爬滚打的程序员们的神器. 为什么要自己制作文档 官方的源中没有相关文档 文档在离线下体验更好 ...

  2. Unity2D 里的场景缩放实现

    闲时以 Unity2D 练手时想实现端游里的场景缩放功能,而网上的代码几乎全是 3D 场景缩放相关,所以我自己编写了个 2D 场景缩放脚本(C#). 代码如下: using UnityEngine; ...

  3. Android开发工具之Dash

    作为一名死coder,每天最常见的动作就是查看各种API文档,你一定也有过同时打开N个窗口(HTML.PDF.CHM),不停的在编辑器与文档之间切换的感受吧?怎么说呢,其实我很讨厌这种枯燥无味的动作, ...

  4. 时光煮雨 Unity3D实现2D人物动画② Unity2D 动画系统&资源效率

    系列目录 [Unity3D基础]让物体动起来①--基于UGUI的鼠标点击移动 [Unity3D基础]让物体动起来②--UGUI鼠标点击逐帧移动 时光煮雨 Unity3D让物体动起来③—UGUI DoT ...

  5. Unity2D多分辨率屏幕适配方案(转载)

    一下内容转自:http://imgtec.eetrend.com/forum/3992 此文将阐述一种简单有效的Unity2D多分辨率屏幕适配方案,该方案适用于基于原生开发的Unity2D游戏,即没有 ...

  6. Ubuntu下shell脚本运行异常:bash和dash的区别

    Ubuntu下我用bash到语法写了一个shell脚本(准确的说是把书上的脚本敲进电脑),在ubuntu下,用sh test.sh来运行,但是出现了意料之外到结果,比如echo -e "\n ...

  7. Dash

    作为一名死coder,每天最常见的动作就是查看各种API文档,你一定也有过同时打开N个窗口(HTML.PDF.CHM),不停的在编辑器与文档之间切换的感受吧?怎么说呢,其实我很讨厌这种枯燥无味的动作, ...

  8. debian和ubuntu的sh dash bash

    Ubuntu和debian 的 shell 默认安装的是 dash,而不是 bash.运行以下命令查看 sh 的详细信息,确认 shell 对应的程序是哪个:$ls -al /bin/sh dash ...

  9. Unity2D之让土豆人动起来

    Unity2D功能 Unity3D最新的4.3版本,其中最大的新功能就是这个2D工具了.我这里简单介绍一下这个2D工具是怎样使用的. 首先,在我们创建项目的时候,面板上面多了一个2d和3d的选择,这两 ...

随机推荐

  1. UiPath文本操作Get Text的介绍和使用

    一.Get Text操作的介绍 从指定的UI元素提取文本值 二.Get Text在UiPath中的使用 1. 打开设计器,在设计库中新建一个Sequence,为序列命名及设置Sequence存放的路径 ...

  2. python小题目练习(三)

    题目:输出1!+2!+3!+--+10!的结果代码实现: # 定义一个函数来递归实现阶乘操作def cycle(num): if num == 1: return 1 else: return num ...

  3. lerna学习笔记

    lerna简介 Lerna 是一个优化基于Git+npm的多package项目的项目管理工具,lerna是架构优化的产物,项目复杂度提升后,架构优化的主要目标是以提高ROI为核心的 lerna的主要功 ...

  4. static 和 final(java)

    static: 1.1static修饰成员变量: 使用static修饰的成员变量不在对象的数据结构,而是类的基本信息(参数) 使用static修饰的成员可以直接使用,类名.成员的方式访问,而不需要再n ...

  5. 前 K 个高频元素问题

    前 K 个高频元素问题 作者:Grey 原文地址: 前 K 个高频元素问题 题目描述 LeetCode 347. Top K Frequent Elements 思路 第一步,针对数组元素封装一个数据 ...

  6. postgresql自增id

    drop index Ix_product_define_id; drop index Ix_user_umid; drop table invims_product_attention; /*=== ...

  7. Techempower web框架性能测试第21轮结果发布--asp.net core继续前进

    废话不说,直接上结果: Round 21 results - TechEmpower Framework Benchmarks Techempower benchmark是包含范围最广泛的web框架性 ...

  8. ServerlessBench 2.0:华为云联合上海交大发布Serverless基准测试平台

    摘要:华为云联合上海交大重磅推出ServerlessBench 2.0,为社区提供涵盖12类基准测试用例.新增5大类跨平台测试用例.4大类关键特性指标.且多平台兼容的Serverless开放基准测试集 ...

  9. Azure Devops(十五) 使用Azure的私有Maven仓库

    上一篇文章中,我们介绍了如何使用Azure的nuget仓库,今天我们来研究一下如何使用azure给我们提供的maven仓库. 首先,我们打开azureDevops,点击到制品界面,然后选择maven. ...

  10. 【Azure 应用服务】本地创建Azure Function Kafka Trigger 函数和Kafka output的HTTP Trigger函数实验

    问题描述 在上一篇博文(https://www.cnblogs.com/lulight/p/16525902.html)中,我们成功的以VM作为Kafka服务器运行,并且验证了从其他机器中远程访问.在 ...