美文网首页
Unity&Dragonbons骨骼动画篇(三)——怎么让角色动

Unity&Dragonbons骨骼动画篇(三)——怎么让角色动

作者: _夕羊_ | 来源:发表于2018-10-19 16:39 被阅读0次

创建了对象后,怎么动起来呢?

那就让角色动起来吧

首先来梳理一下动起来需要哪些步骤:

  1. 引用Dragonbones命名空间(这个以后就省略了,刚需!!!)
  2. 加载资源
  3. 创建对象
  4. 监测按键
  5. 移动

按照这个顺序来一个:

1.创建一个脚本,并引用命名空间
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DragonBones;

public class PlayerMove : BaseDemo{

}

2.加载资源

public class PlayMove : BaseDemo{
    protected override void OnStart(){
        UnityFactory.factory.LoadDragonBonesData ("person_1/person_1_ske");
        UnityFactory.factory.LoadTextureAtlasData ("person_1/person_1_tex");
    }
}

3.创建对象

这里我们不用之前的方法创建对象了,而是把对象封装在一个类里,然后把关于对象的操作也放在这个类里,程序看起来就简单明了了。这个类后面我们再来具体实现它。

public class PlayMove : BaseDemo{
    private Player _player;
    protected override void OnStart(){
        UnityFactory.factory.LoadDragonBonesData ("person_1/person_1_ske");
        UnityFactory.factory.LoadTextureAtlasData ("person_1/person_1_tex");
        
        this._player = new Player ();
    }
}

4.监测按键并调用移动的方法

先来定义一下上下左右的按键

public const KeyCode left  = KeyCode.A;
public const KeyCode right = KeyCode.D;
public const KeyCode up    = KeyCode.W;
public const KeyCode down  = KeyCode.S;

调用Move()方法移动角色,这里的OnUpdate()方法在BaseDemo.cs 125行,是用virtual修饰符声明了一个虚方法,并且在Update()中调用了它,所以在这个PlayerMove.cs中会自动执行这个方法。

protected override void OnUpdate(){
    var isLeft  = Input.GetKey (left);
    var isRight = Input.GetKey (right);
    var isUp    = Input.GetKey (up);
    var isDown  = Input.GetKey (down);

    if (isUp) {
        this._player.Move (0, 1);
    } else if (isDown) {
        this._player.Move (0, -1);
    }

    if (isLeft) {
        this._player.Move (-1, 0);
    } else if (isRight) {
        this._player.Move (1, 0);
    }

    if (isLeft == isRight && isUp == isDown) {
        this._player.Move (0, 0);
    }
}

5.完成Player类

public class Player
{
    private const float NORMALIZE_MOVE_SPEED = 0.1f;//标准移动速度
    private const float MAX_MOVE_SPEED_FRONT = NORMALIZE_MOVE_SPEED * 1.4f;//最大向前移动速度
    private const float MAX_MOVE_SPEED_BACK = NORMALIZE_MOVE_SPEED * 1.0f;//最大向后移动速度
    private int _faceDir = 1;//方向
    private int _moveHorizontalDir = 0;//水平移动距离
    private int _moveVerticleDir = 0;//垂直移动距离
    private float _speedX = 0.0f;//水平移动速度
    private float _speedY = 0.0f;//垂直移动速度
    private DragonBones.Armature _armature;
    private UnityArmatureComponent _armatureComponent;
    private DragonBones.AnimationState _walkState = null;//动画状态,播放动画时产生,可以对每个播放的动画进行更细致的控制和调节。

    //构造方法
    public Player()
    {
        this._armatureComponent = UnityFactory.factory.BuildArmatureComponent("Armature人设1改(动画)", "person_1");
        this._armature = this._armatureComponent.armature;
        this._armatureComponent.name = "person_2";
        this._armatureComponent.transform.localPosition = new Vector3(0.0f, CoreElement.GROUND, 0.0f);
        this._UpdateAnimation();
    }

    //移动方法
    public void Move(int horizontalDir,int verticalDir)
    {
        if (this._moveHorizontalDir == horizontalDir && this._moveVerticleDir == verticalDir)
        {
            return;
        }

        this._moveHorizontalDir = horizontalDir;
        this._moveVerticleDir = verticalDir;
        this._UpdateAnimation();
    }
        

    public void Update()
    {
        this._UpdatePosition();

    }

    //更新位置方法
    private void _UpdatePosition()
    {
        if (this._speedX == 0.0f && this._speedY == 0.0f)
        {
            return;
        }

        var position = this._armatureComponent.transform.localPosition;

        if (this._speedX != 0)
        {
            position.x += this._speedX * this._armatureComponent.animation.timeScale;

            if (position.x < -4.0f)
            {
                position.x = -4.0f;
            }
            else if (position.x > 4.0f)
            {
                position.x = 4.0f;
            }
        }
            
        if (this._speedY != 0.0f) {
            position.y += this._speedY * this._armatureComponent.animation.timeScale;
            if (position.y < -4.0f) {
                position.y = -4.0f;
            } else if (position.y > 4.0f) {
                position.y = 4.0f;
            }
        }

        this._armatureComponent.transform.localPosition = position;
    }
        
    //更新动画方法
    private void _UpdateAnimation()
    {
        //没有移动时的动画
        if (this._moveHorizontalDir == 0 && _moveVerticleDir == 0)
        {
            this._speedX = 0;
            this._speedY = 0;
            this._armature.animation.FadeIn("stand", -1.0f, -1, 0).resetToPose = false;
            this._walkState = null;
        }
        else
        {
            //移动时的动画
            if (this._walkState == null)
            {
                this._walkState = this._armature.animation.FadeIn("moving", -1.0f, -1, 0);
                this._walkState.resetToPose = false;
            }

            //控制角色迈腿方向
            if (this._moveHorizontalDir * this._faceDir > 0 || this._moveVerticleDir * this._faceDir > 0) {
                this._walkState.timeScale = MAX_MOVE_SPEED_FRONT / NORMALIZE_MOVE_SPEED;
            } 
            else if (this._moveVerticleDir * this._faceDir < 0) 
            {
                this._walkState.timeScale = MAX_MOVE_SPEED_FRONT / NORMALIZE_MOVE_SPEED;
            }
            else
            {
                this._walkState.timeScale = -MAX_MOVE_SPEED_BACK / NORMALIZE_MOVE_SPEED;
            }

            //控制角色移动方向
            if (this._moveHorizontalDir * this._faceDir >= 1)
            {
                this._speedX = MAX_MOVE_SPEED_FRONT * this._faceDir;
                Debug.Log (this._moveHorizontalDir * this._faceDir);
            }
            else if(this._moveHorizontalDir * this._faceDir <= -1)
            {
                this._speedX = -MAX_MOVE_SPEED_BACK * this._faceDir;
                Debug.Log (this._moveHorizontalDir * this._faceDir);
            }

            if (this._moveVerticleDir * this._faceDir >= 1) {
                this._speedY = MAX_MOVE_SPEED_FRONT * this._faceDir;
            } else if(this._moveVerticleDir * this._faceDir <= -1){
                this._speedY = -MAX_MOVE_SPEED_FRONT * this._faceDir;
            }
        }
    }
}

最后贴出完整代码,详细解析都在注释里:

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

public class PlayerMove : BaseDemo {
    public const float GROUND = 0.0f;//地面。

    //键盘控制
    public const KeyCode left = KeyCode.A;
    public const KeyCode right = KeyCode.D;
    public const KeyCode up = KeyCode.W;
    public const KeyCode down = KeyCode.S;

    //Player类的对象
    private Player _player;

    protected override void OnStart()
    {
        // Load data加载数据
        UnityFactory.factory.LoadDragonBonesData("person_1/person_1_ske");
        UnityFactory.factory.LoadTextureAtlasData("person_1/person_1_tex");

        //new一个实例
        this._player = new Player();
    }

    protected override void OnUpdate()
    {
        // Input 
        var isLeft = Input.GetKey(left);
        var isRight = Input.GetKey(right);
        var isUp = Input.GetKey(up);
        var isDown = Input.GetKey(down);
         
        /*移动  i
         * sLeft == isRight 这句话有点坑,就是无论一起按还是一起不按都生效。
         * if(){……}
         * else if(){……}
         * else{} 
         * 与
         * if(){……}else{}
         * if(){……}else{}
         * 会产生不一样的效果
         * 下面判断才能达到我上下左右移动不出差的效果,其实就有很多种情况,列出一种没错但是效果不一致的情况
         * if (isUp) {this._player.Move (0, 1);} 
         * else if (isDown) {this._player.Move (0, -1);} 
         * else if (isLeft) {this._player.Move (-1, 0);} 
         * else if (isRight) {this._player.Move (1, 0);} 
         * else if (isLeft == isRight && isUp == isDown) {this._player.Move (0, 0);}
         * 当然,控制角色上下移动的方法还很多。
         * */

        if (isUp) {
            this._player.Move (0, 1);
        } else if (isDown) {
            this._player.Move (0, -1);
        } 

        if (isLeft) {
            this._player.Move (-1, 0);
        } else if (isRight) {
            this._player.Move (1, 0);
        } 

        if (isLeft == isRight && isUp == isDown) {
            this._player.Move (0, 0);
        }
            
        this._player.Update();

    }
}

//玩家类start
public class Player
{
    private const float NORMALIZE_MOVE_SPEED = 0.1f;//标准移动速度
    private const float MAX_MOVE_SPEED_FRONT = NORMALIZE_MOVE_SPEED * 1.4f;//最大向前移动速度
    private const float MAX_MOVE_SPEED_BACK = NORMALIZE_MOVE_SPEED * 1.0f;//最大向后移动速度
    private int _faceDir = 1;//方向
    private int _moveHorizontalDir = 0;//水平移动距离
    private int _moveVerticleDir = 0;//垂直移动距离
    private float _speedX = 0.0f;//水平移动速度
    private float _speedY = 0.0f;//垂直移动速度
    private DragonBones.Armature _armature;
    private UnityArmatureComponent _armatureComponent;
    private DragonBones.AnimationState _walkState = null;//动画状态,播放动画时产生,可以对每个播放的动画进行更细致的控制和调节。

    //构造方法
    public Player()
    {
        this._armatureComponent = UnityFactory.factory.BuildArmatureComponent("Armature人设1改(动画)", "person_1");
        this._armature = this._armatureComponent.armature;
        this._armatureComponent.name = "person_2";
        this._armatureComponent.transform.localPosition = new Vector3(0.0f, CoreElement.GROUND, 0.0f);
        this._UpdateAnimation();
    }

    //移动方法
    public void Move(int horizontalDir,int verticalDir)
    {
        if (this._moveHorizontalDir == horizontalDir && this._moveVerticleDir == verticalDir)
        {
            return;
        }

        this._moveHorizontalDir = horizontalDir;
        this._moveVerticleDir = verticalDir;
        this._UpdateAnimation();
    }
        

    public void Update()
    {
        this._UpdatePosition();

    }

    //更新位置方法
    private void _UpdatePosition()
    {
        if (this._speedX == 0.0f && this._speedY == 0.0f)
        {
            return;
        }

        var position = this._armatureComponent.transform.localPosition;

        if (this._speedX != 0)
        {
            position.x += this._speedX * this._armatureComponent.animation.timeScale;

            if (position.x < -4.0f)
            {
                position.x = -4.0f;
            }
            else if (position.x > 4.0f)
            {
                position.x = 4.0f;
            }
        }
            
        if (this._speedY != 0.0f) {
            position.y += this._speedY * this._armatureComponent.animation.timeScale;
            if (position.y < -4.0f) {
                position.y = -4.0f;
            } else if (position.y > 4.0f) {
                position.y = 4.0f;
            }
        }

        this._armatureComponent.transform.localPosition = position;
    }
        
    //更新动画方法
    private void _UpdateAnimation()
    {
        //没有移动时的动画
        if (this._moveHorizontalDir == 0 && _moveVerticleDir == 0)
        {
            this._speedX = 0;
            this._speedY = 0;
            this._armature.animation.FadeIn("stand", -1.0f, -1, 0).resetToPose = false;
            this._walkState = null;
        }
        else
        {
            //移动时的动画
            if (this._walkState == null)
            {
                this._walkState = this._armature.animation.FadeIn("moving", -1.0f, -1, 0);
                this._walkState.resetToPose = false;
            }

            //控制角色迈腿方向
            if (this._moveHorizontalDir * this._faceDir > 0 || this._moveVerticleDir * this._faceDir > 0) {
                this._walkState.timeScale = MAX_MOVE_SPEED_FRONT / NORMALIZE_MOVE_SPEED;
            } 
            else if (this._moveVerticleDir * this._faceDir < 0) 
            {
                this._walkState.timeScale = MAX_MOVE_SPEED_FRONT / NORMALIZE_MOVE_SPEED;
            }
            else
            {
                this._walkState.timeScale = -MAX_MOVE_SPEED_BACK / NORMALIZE_MOVE_SPEED;
            }

            //控制角色移动方向
            if (this._moveHorizontalDir * this._faceDir >= 1)
            {
                this._speedX = MAX_MOVE_SPEED_FRONT * this._faceDir;
                Debug.Log (this._moveHorizontalDir * this._faceDir);
            }
            else if(this._moveHorizontalDir * this._faceDir <= -1)
            {
                this._speedX = -MAX_MOVE_SPEED_BACK * this._faceDir;
                Debug.Log (this._moveHorizontalDir * this._faceDir);
            }

            if (this._moveVerticleDir * this._faceDir >= 1) {
                this._speedY = MAX_MOVE_SPEED_FRONT * this._faceDir;
            } else if(this._moveVerticleDir * this._faceDir <= -1){
                this._speedY = -MAX_MOVE_SPEED_FRONT * this._faceDir;
            }
        }
    }
}
//玩家类end

最后看看效果吧

角色移动效果图

相关文章

网友评论

      本文标题:Unity&Dragonbons骨骼动画篇(三)——怎么让角色动

      本文链接:https://www.haomeiwen.com/subject/wdayzftx.html