首页 > 其他分享 >Unity 角色移动2D动画模块

Unity 角色移动2D动画模块

时间:2023-05-13 16:12:45浏览次数:49  
标签:动画 direction Vector2 Equals private else 2D Unity spriteRenderer

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

[RequireComponent(typeof(SpriteRenderer))]
public class SpriteAnimator : MonoBehaviour
{
    private SpriteRenderer spriteRenderer;

    [SerializeField]
    private Sprite idleSprite;
    [SerializeField]
    private Sprite[] moveUpSprites;
    [SerializeField]
    private Sprite[] moveDownSprites;
    [SerializeField]
    private Sprite[] moveLeftSprites;
    [SerializeField]
    private Sprite[] moveRightSprites;


    private Vector2 lastDirection;
    [HideInInspector]
    public Vector2 direction;

    private int currentSpriteIndex = 0;
    private float timePlayedForCurrentSpriteFrame;
    [SerializeField]
    private float timeFor1Frame = 0.5f;

    private void Awake()
    {
        spriteRenderer = GetComponent<SpriteRenderer>();
    }


    void Start()
    {
        TypeSingleton.Get<PlayerController>().OnDirectionChanged += SetDirection;
        spriteRenderer.sprite = idleSprite;
    }

    // Update is called once per frame
    void Update()
    {

        if (direction.Equals(Vector2.zero)) PlayIdle();
        else if(direction.Equals(Vector2.up)) PlayMove(moveUpSprites);
        else if(direction.Equals(Vector2.down)) PlayMove(moveDownSprites);
        else if(direction.Equals(Vector2.left)) PlayMove(moveLeftSprites);
        else if (direction.Equals(Vector2.right)) PlayMove(moveRightSprites);

        lastDirection = direction;
    }

    private void PlayMove(Sprite[] spritesList)
    {

        if (timePlayedForCurrentSpriteFrame >= timeFor1Frame)
        {
            timePlayedForCurrentSpriteFrame = 0;

            currentSpriteIndex++;
            if(currentSpriteIndex == spritesList.Length) 
                currentSpriteIndex = 0;
        }

        spriteRenderer.sprite = spritesList[currentSpriteIndex];
        timePlayedForCurrentSpriteFrame += Time.deltaTime;
    }


    private void PlayIdle()
    {
        if (lastDirection.Equals(Vector2.up)) spriteRenderer.sprite = moveUpSprites[0];
        else if (lastDirection.Equals(Vector2.down)) spriteRenderer.sprite = moveDownSprites[0];
        else if (lastDirection.Equals(Vector2.left)) spriteRenderer.sprite = moveLeftSprites[0];
        else if (lastDirection.Equals(Vector2.right)) spriteRenderer.sprite = moveRightSprites[0];

    }


    public void SetDirection(Vector2 direction)
    {
        this.direction = direction;

        if(lastDirection != direction)  
            currentSpriteIndex = 0;
    }


}


标签:动画,direction,Vector2,Equals,private,else,2D,Unity,spriteRenderer
From: https://www.cnblogs.com/dewxin/p/17397567.html

相关文章

  • 西门子界面官方精美触摸屏+WINCC程序模板 西门子官方触摸屏程序模板,炫酷的扁平式动画
    西门子界面官方精美触摸屏+WINCC程序模板西门子官方触摸屏程序模板,炫酷的扁平式动画效果,脚本动画,自动生成二维码,可仿真,堪比智能手机,有精简,精致,wincc,无线面板等包含了所有西门子人机界面。YID:4639656292012492......
  • Unity3D高级编程主程手记 学习笔记一:软件架构
    架构的重要性不言而喻,对于一个项目来说如果在开发初期就能确定好所使用的引擎,API以及各种系统之间的层次关系,那对于后续的开发一定会是事半功倍的,我想作者将软件架构放在第一章一定是想让Untiy程序员尤其是主程,一定要认真的对待架构这件事。优秀的架构师不仅需要对每个子系统的决......
  • 如何实现逐帧动画(OpenHarmony)
    如何实现逐帧动画场景说明逐帧动画是常见的一种动画呈现形式,本例就为大家介绍如何通过OpenHarmony实现逐帧动画。效果呈现本例最终效果如下:点击“run”按钮,火柴人开始走动。点击“stop”按钮,火柴人停止走动。运行环境IDE:DevEcoStudio3.1Beta1SDK:Ohos_sdk_public3.2.11.9(APIV......
  • Unity 2021.3.6f1 UnityHub 3.0.1 Win 安装图解 Unity 2021.3
     Unity2021.3.6f1UnityHub3.0.1Win安装图解Unity3D是一款跨平台的游戏引擎软件,它可用于开发2D、3D游戏以及虚拟现实、增强现实等应用程序。Unity3D提供了丰富的功能和工具,让开发者可以快速地创建高质量、交互性强的游戏和应用程序。Unity3D支持多种编程语......
  • vue+cesium实现卫星在轨绕行动画
    1、初始化蓝星首先要实现这个功能,一定要开启时间轴timeline:true,//是否显示时间线控件this.viewer=newCesium.Viewer('cesiumContainer',{    baseLayerPicker:false, //影像切换    animation:false, //是否显示动画控件......
  • 成品直播源码推荐,js点击让窗口抖动动画效果
    成品直播源码推荐,js点击让窗口抖动动画效果比如说用户的未输入密码就点击登录按钮,则输入框会晃动一下提示用户需要输入,实现这种效果很简单,只需要给元素添加一个类,然后做一个关键帧动画即可css代码 .shake{   animation:shake800msease-in-out; }@keyframesshake{......
  • 【开源游戏】Legends-Of-Heroes 基于ET 7.2的双端C#(.net7 + Unity3d)多人在线英雄联
    Legends-Of-Heroes一个LOL风格的球球大作战游戏,基于ET7.2,使用状态同步 Main基于C#双端框架[ET7.2],同步到ET主干详情请看日志。(https://github.com/egametang/ET)注意:已经升级.Net7,请安装.Net7SDK.此游戏为ET7.2的一个实践项目demo,玩法主要是球球大作战类型的吃食物吃敌人/......
  • web前端动画网址
    很实用的web前端动画网址1.https://lhammer.cn/You-need-to-know-css/#/zh-cn/2.https://chokcoco.github.io/CSS-Inspiration/#/3.https://qishaoxuan.github.io/css_tricks/4.https://tobiasahlin.com/spinkit/5.https://animista.net/​————————————————原文......
  • Vue路由跳转时的动画效果
    1.写一个layout组件,降<router-view/>包裹在transition标签里,实现路由跳转时的动画 2.在router/index.js里面引入该组件,并放在component:layout这里,功能完成 3.transition是vue的封装组件,具体可参考官网 https://cn.vuejs.org/guide/built-ins/transition.html#css-based-......
  • unity Sprite中的Pixels Per Unit
    unity中最小的网格就是1unit。1unit默认是1米。1Unityunit=1meter(100cm)对于一个16*16像素的图片,如果我们将其PixelsPerUnit设置为16,那么这张图片的长宽都是1unit。在unity中刚好契合最小的格子。......