美文网首页
从零开始的RPG制作(2.2-脚本整理以及定时器处理)

从零开始的RPG制作(2.2-脚本整理以及定时器处理)

作者: 小蜻蜓队长 | 来源:发表于2019-04-26 16:15 被阅读0次

接下来我们来整理一下脚本,在原先的PlayerTestView脚本中充斥着很多杂七杂八的东西,现在我们将属于Animator的东西从这个脚本中分离出来,我们新建一个脚本PlayerTestVie_Anim用于存放动画类相关,两者的类名是相同的,只是因为臃肿所以用partial关键字区分为两个脚本。

除此之外,还添加了一个新功能,在RPG中,一段时间不去操作,角色的站立姿势就会发现改变,用于挑逗玩家,我们这里进行了时装,为了实装每隔一段时间的操作,我们就需要引入一个新的东西,计时器的功能是必不可少的,大家可以去看一看一位大佬的简书,这里附上地址。
计时器简介
在通读了计时器的脚本之后,我们发现他的一部分内容还是和我们预先设定的有些违背(关于update的管理),所以在这里我进行更改,如果大家也一起做,你们不做更改也是行的。
下面是动画控制器的修改

动画控制器-1 动画控制器-2

下面附上新脚本PlayerTestVie_Anim的内容:

/*
 * PlayerTestView
 * 将来这个脚本里的功能坑定会制作一个接口类,用存放其中其动画功能,毕竟能走能跑能站的不只是player,还有很多NPC以及怪物
 */

using strange.extensions.mediation.impl;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(Animator))]
public partial class PlayerTestView:View {

    [Header("===== 组件 =====")]
    Animator animator;
    [Header("===== 数据 =====")]
    PlayerAnimaId pad;
    Timer idleTypeTimer;
    [Tooltip("idle 动画切换的间隔时间")]
    float idleChangeTime = 5;
    [Tooltip("idle 动画开始转变信号")]
    bool idleChangeing = false;
    [Tooltip("idle 动画开始转变的渐变数值")]
    float idleRange = 0;
    enum Idle_Type {//idle的形态变换,与动画数据的相关,idle的数值切换相同。0,1,2,3
        idle_A = 0,
        idle_B,
        idle_C,
        idle_D,
    }
    Idle_Type newIdle_Type = Idle_Type.idle_A;
    struct PlayerAnimaId {
        public int Idle;//禁止状态行为切换控制。
        public int baseAniam;
    };

    private void playerAnimatorInit() {
        pad = new PlayerAnimaId();
        animator = GetComponent<Animator>();
        pad.baseAniam = Animator.StringToHash("walk");
        pad.Idle = Animator.StringToHash("Idle");
    }
    /// <summary>
    /// 播放 三个基础动画
    /// </summary>
    private void animator_PlayBaseAniam() {
        animator.SetFloat(pad.baseAniam, lerpSpeed);
    }
    /// <summary>
    /// 如果站立的时间太久,那么就切换一种idle形态。这里我们默认为5秒
    /// </summary>
    private void animator_ChangeIdle() {
        if (controlDistance == 0) {//代表此时已经完全停下
            if (idleTypeTimer == null || idleTypeTimer.isDone) {//如果没有计时器或者计时器处于空闲状态
                idleTypeTimer = Timer.Register(idleChangeTime, () => {
                    idleChangeing = true;
                    newIdle_Type = (Idle_Type)Random.Range((int)Idle_Type.idle_A + 1, (int)Idle_Type.idle_D + 1);//获取一个最新的Idle来替换。在BCD中挑选
                });
            }
            if (idleChangeing) {//可以发生改变
                idleRange = Mathf.Lerp(idleRange, (float)newIdle_Type, 0.05f);
                animator.SetFloat(pad.Idle, idleRange);
            }
        } else {
            animator.SetFloat(pad.Idle, (float)Idle_Type.idle_A);//刚起步的的时候默认A动画。
            idleChangeing = false;
            idleRange = (float)Idle_Type.idle_A;//刚起步的的时候默认A状态
        }
    }
}

PlayerTestView的码子如下:

   using strange.extensions.mediation.impl;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public partial class PlayerTestView:View {

    /// <summary>
    //public water plane;
    /// </summary>
    // Use this for initialization
    [Header("===== 组件 ====")]
    Rigidbody rig;
    CapsuleCollider capsuleCollider;
    [Header("===== 数据 ====")]
    float lerpSpeed = 0;//控制衰减。
    float controlDistance = 0;//控制距离
    float addSpeed = 1;
    float runSpeed = 3;
    float walkSpend = 1;
    private Vector3 moveDirection;
    Transform player;
    public void init() {
        rig = GetComponent<Rigidbody>();
        player = transform;
        playerAnimatorInit();
        capsuleCollider = GetComponent<CapsuleCollider>();
    }
  public  void animaBlendAction(float right, float forward, bool run) {//设置转向以及速度
        Vector3 vec = (right * Vector3.right + forward * Vector3.forward);//设置方向
        controlDistance = vec.magnitude;
        if (controlDistance < Vector3.kEpsilon) {//停下
            controlDistance = 0;
            lerpSpeed = Mathf.Lerp(lerpSpeed, 0, 0.2f);//速度逐渐归零。
    
        } else {//开始行动
            player.forward = Vector3.Slerp(player.forward, vec, 0.2f);//设置转向
            float upperLimit = run ? runSpeed : walkSpend;
            lerpSpeed = Mathf.Lerp(lerpSpeed, upperLimit, 0.1f);//速度逐步上升。
        }
       animator_ChangeIdle();//播放Idle
        animator_PlayBaseAniam();//播放动画
        moveDirection = Vector3.Project(moveDirection, Vector3.up);
        moveDirection += player.forward * lerpSpeed * addSpeed;
    }

    public void playerMove() {
        //**//
        //player.position += moveDirection * Time.deltaTime;
        //rig.velocity = Vector3.zero;
        //**//
           rig.velocity = moveDirection;
    }
}
静止时不断变化的动作

由于没有找到好一点的动作,比如无聊踢腿之类的那些,所有看着有些怪怪的~

上一节
下一节

相关文章

网友评论

      本文标题:从零开始的RPG制作(2.2-脚本整理以及定时器处理)

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