美文网首页
从零开始的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