DoTween使用

2023-11-17

using System.Collections;
using UnityEngine;
using DG.Tweening;
using UnityEngine.UI;
/*
* DOTween真的比iTween好很多:
* 1.编写方面更加人性化
* 2.效率高很多
* DoTween插件的基本概念以及简介:
* 1.DoTween实现的是通用的缓动算法,用于给Unity中的游戏对象添加动作动画。
* 2.DoTween的API风格一律采用链式调用,再配以Lambda匿名函数的调用,可以配置出各种各样想要的丰富的动画效果。
* 3.DoTween还可以实现队列延迟回调函数,也能完成各种异步延迟执行的功能
* 4.DoTween为了方便开发者使用,对各种Unity的脚本对象进行了函数绑定,例如:
* Transform, Color, Text, Material等都可以直接调用DoTween的动画函数
* 绑定的快捷方式动画函数API
* 函数名称解释:
* 都是以DO开头,带Local的就是局部坐标系,不带的指的是基于世界坐标系
* 所有函数调用都是链式调用
* 可以自己设置缓动算法的类型,也可以用一些已经配置好的缓动算法,比如跳跃Jump
* 这类函数的API调用更符合常用函数的使用习惯,move就是移动,scale就是缩放,rotation就是旋转,color就是颜色,数值的变化就是float
* 更多的功能用法直接在程序中自动补全就可以理解意思了
* 1.以DO开头的方法:就是补间动画的方法。例如:transform.DOMoveX(100,1)
* 2.以Set开头的方法:设置补间动画的一些属性。例如:myTween.SetLoops(4, LoopType.Yoyo)
* 3.以On开头的方法:补间动画的回调方法。例如:myTween.OnStart(myStartFunction)
好了,正式开始!
*/
public class CubeAnimator : MonoBehaviour
{
    Camera _camera;
    Material material;
    public Text text;
    Tweener _tweener;
    void Start()
    {
        /*DOTween初始化与全局设置:
        当你第一次创建一个Tween时,DOTween就会自动初始化(只初始化一次)。
        当然,也可以使用DOTween.Init方法进行自定义,但要在第一次创建一个Tween前。所有创建的Tween都会受DOTween.Init方法的影响。
        *recycleAllByDefault :如果为true,则当Tween完成时就会被回收,放到一个池中;否则就会被destroy
        *useSafeMode :效率会稍微降低,但更安全
        *logBehaviour :默认值为只打印错误信息
        */
        DOTween.Init(false, true, LogBehaviour.ErrorsOnly);
        _camera = Camera.main;
        material = GetComponent<MeshRenderer>().material;
        //一、Unity常用组件拓展方法
        //(1) Transform拓展方法
        TestTransformFuncAnim();
        //(2) _camera拓展方法
        TestCameraFuncAnim();
        //(3) Material拓展方法
        TestMaterialFuncAnim();
        //(4) Text拓展方法
        TestTextFuncAnim();
        //二、Dotween常用方法
        //Sequence动画序列函数API
        /*
         * 基本解释说明:
         * 动画序列其实就是包含了一组Tweener并且操作其他Tweener的一个工具
         * 动画序列并不一定要一个接着一个的播放和执行
         * 动画序列之间可以重叠和重复
         * 你可以以任何你所期望的形式混合夹杂着去使用它们
         * DOTween.Sequence()会创建一个动画序列对象,以后所有的Sequence函数都会返回这个Sequence对象,也就是说动画序列也可以链式调用
         * Append(tweener) 可以在队尾追加一个tweener,会按照顺序依次执行这个tweener序列,一个tweener完成后执行下一个。
         * Insert(time, tweener) 可以在队列中插入一个tweener,第1个参数代表插入的时间点,第2个参数代表在此时间点插入的动画。
         * AppendInterval(time) 可以在队尾追加一个时间间隔功能函数,在队列执行的过程中,停顿一个时间,然后继续执行。
         * AppendCallback(func) 可以在队尾追加一个匿名函数,在队列中执行一个回调。
         */
        //(5) Sequence 队列
        TestSequenceAnim();
        //(6) Tweener的设置
        SetterTweener();
        //7.关于Ease缓动函数的说明
        /*
         * 基本概念说明:
         * 缓动函数是指动画效果在执行时的速度,使其看起来更加真实。
         * Ease.InSine 表示正弦加速动作
         * Ease.OutSine 表示正弦减速动作
         * Ease.InOutSine 表示正弦加速减速动作
         * 每个效果都分3种缓动方式:
         * (1).easeIn:从0开始加速的缓动
         * (2).easeOut:减速到0的缓动
         * (3).easeInOut:前半段从0开始加速,后半段减速到0的缓动
         * 其中Linear是线性缓动,也叫无缓动效果,没有上述说明中的效果。
         */
        //(7) 运动曲线的设置
        TestEaseFuncAnima();
        //(8) 动画回调事件
        TestCallBack();
        //(9) 动画控制方法
        TestAnimatorController();
        //(10) 获取数据方法
        GetTweenerDat();
        //(11) 协程方法
        StartCoroutine(Wait());
    }
    //(1) Transform拓展方法
    private void TestTransformFuncAnim()
    {
        //Position
        //1)改变世界坐标
        //移动方法,第一个参数是要移动到的目标点,不是移动这个向量的距离
        transform.DOMove(new Vector3(1, 1, 1), 2);
        //只控制x轴上的移动,其他两个方向同理
        transform.DOMoveX(1, 2);
        //2)改变局部坐标
        transform.DOLocalMove(new Vector3(1, 1, 1), 2);
        transform.DOLocalMoveX(1, 2);
        //Rotation
        //1)世界旋转
        //旋转到给定的值,改变的是欧拉角
        transform.DORotate(new Vector3(0, 90, 0), 2);
        //旋转到给定的值,改变的是四元数
        transform.DORotateQuaternion(new Quaternion(0.1f, 0.1f, 0.1f, 0.1f), 2);
        //2)局部旋转
        // 旋转到给定的值,改变的是欧拉角
        transform.DOLocalRotate(new Vector3(0, 90, 0), 2);
        // 旋转到给定的值,改变的是四元数
        transform.DOLocalRotateQuaternion(new Quaternion(0.1f, 0.1f, 0.1f, 0.1f), 2);
       // 在给定时间内,平滑的让自身的z轴正方向指向目标点
        transform.DOLookAt(new Vector3(0, 0, 0), 2);
        // Scale
        //同上面一样,这里改变物体的缩放到目标值
        transform.DOScale(new Vector3(2, 2, 2), 2);
        //其他两个轴向同理
        transform.DOScaleX(3, 2);
        //Punch
        /*
        第一个参数 punch:表示方向及强度
        第二个参数 duration:表示动画持续时间
        第三个参数 vibrato:震动次数
        第四个参数 elascity: 这个值是0到1的
        当为0时,就是在起始点到目标点之间运动
        不为0时,会把你赋的值乘上一个参数,作为你运动方向反方向的点,物体在这个点和目标点之间运动
        */
        transform.DOPunchPosition(new Vector3(0, 1, 0), 2, 2, 0.1f);
        transform.DOPunchRotation(new Vector3(0, 90, 0), 2, 2, 0.1f);
        transform.DOPunchScale(new Vector3(2, 2, 2), 2, 2, 0.1f);
        //Shake
        /*
         * 参数:持续时间,力量,震动,随机性,淡出
        力量:实际就是震动的幅度,可以理解成相机施加的力的大小 使用Vector3可以选择每个轴向不同的强度
        震动:震动次数
        随机性:改变震动方向的随机值(大小:0~180)
        淡出:就是运动最后是否缓慢移动回到原本位置
        */
        transform.DOShakePosition(1, 5, 10, 50, true);
        transform.DOShakeRotation(3);
        transform.DOShakeScale(3);
        //带Blend名称的方法,允许混合动画
       //原本同时执行两个Move方法,只会执行最新的一个动画命令
       //例如:
        transform.DOMove(Vector3.one, 2);
        transform.DOMove(Vector3.one * 2, 2);
       //结果是物体运动到了(2,2,2)坐标上
        //DOBlendableMoveBy方法有两个特点
       //1)允许多个同时执行
       //例如:
        transform.DOBlendableMoveBy(new Vector3(1, 1, 1), 1);
        transform.DOBlendableMoveBy(new Vector3(-1, 0, 0), 1);
        //假设起始为(0,0,0),最后动画停止时的坐标就是(0,1,1)
        //2)它是增量动画
        transform.DOBlendableMoveBy(new Vector3(1, 1, 1), 1);
        //假设其实点为(1,1,1),最后动画停止时的坐标就是(2,2,2)
        //它的参数不是目标点,而是要移动的量
        /*以下三个函数同理
        transform.DOBlendableRotateBy
        transform.DOBlendableScaleBy()
        transform.DOBlendablePunchRotation()
        */
    }
    //(2) Camera拓展方法
    private void TestCameraFuncAnim()
    {
        //1)调整屏幕视角的宽高比 第一个参数是宽高的比值
        _camera.DOAspect(0.6f, 2);
        //2)改变相机background参数的颜色
        _camera.DOColor(Color.blue, 2);
        //3)改变相机近切面的值
        _camera.DONearClipPlane(200, 2);
        //4)改变相机远切面的值
        _camera.DOFarClipPlane(2000, 2);
        //5)改变相机FOV的值
        _camera.DOFieldOfView(30, 2);
        //6)改变相机正交大小
        _camera.DOOrthoSize(10, 2);
        //7)按照屏幕像素计算的显示范围
        _camera.DOPixelRect(new Rect(0f, 0f, 600f, 500f), 2);
        //8)按照屏幕百分比计算的显示范围
        _camera.DORect(new Rect(0.5f, 0.5f, 0.5f, 0.5f), 2);
        /*
         9)相机震动
          相机震动效果 参数:持续时间,力量,震动,随机性,淡出
          力量:实际就是震动的幅度,可以理解成相机施加的力的大小 使用Vector3可以选择每个轴向不同的强度
        震动:震动次数
        随机性:改变震动方向的随机值(大小:0~180)
        淡出:就是运动最后是否缓慢移动回到原本位置
        */
        _camera.DOShakePosition(1, 10, 10, 50, false);
    }
    //(3) Material拓展方法
    private void TestMaterialFuncAnim()
    {
        // 1)改变颜色
        material.DOColor(Color.black, 2);
        // 2)按照shader的属性名,修改颜色
        material.DOColor(Color.clear, "_Color", 2);
        // 3)修改alpha值
        material.DOFade(0, 2);
        // 4)颜色渐变
       // Gradient是unity的渐变编辑器(下面有渐变编辑器的图)
       // material.DOGradientColor(Gradient, "_Color", 3);
        // 5)改变材质offset的值
        material.DOOffset(new Vector2(1, 1), 2);
        // 6)改变提供的shader属性的名称对应的Vector4值
        material.DOVector(new Vector4(0, 0, 0, 1), "_Color", 3);
        // 7)颜色混合
        //  跟位置混合动画同理,可以同时执行而不干扰,产生混合在一起的颜色
        material.DOBlendableColor(Color.red, "_Color", 3);
    }
   //(4) Text拓展方法
    private void TestTextFuncAnim()
    {
        //头三个都是常规方法,不多介绍了
        text.DOColor(Color.black, 2);
        text.DOFade(0, 2);
        text.DOBlendableColor(Color.black, 2);
        //打字机效果
        //是把第一个参数传入的内容按照时间,一个字一个字的输入到文本框中
        text.DOText("context", 2);
    }
    //(5) Sequence 队列
    private void TestSequenceAnim()
    {
        Sequence quence = DOTween.Sequence();
        //1)添加动画到队列中
        quence.Append(transform.DOMove(Vector3.one, 2));
        //2)添加时间间隔
        quence.AppendInterval(1);
        //3)按时间点插入动画
          //第一个参数为时间,此方法把动画插入到规定的时间点
         // 以这句话为例,它把DORotate动画添加到此队列的0秒时执行,虽然它不是最先添加进队列的
        quence.Insert(0, transform.DORotate(new Vector3(0, 90, 0), 1));
        //4)加入当前动画
        //  Join会加入和让动画与当前正在执行的动画一起执行
        //如下两行代码,DOMove会和DOScale一起执行
        quence.Append(transform.DOScale(new Vector3(2, 2, 2), 2));
        quence.Join(transform.DOMove(Vector3.zero, 2));
        //5)预添加动画
        //  预添加 会直接添加动画到Append的前面,也就是最开始的时候
        //quence.Prepend(transform.DOScale(Vector3.one * 0.5f, 1));
        //这里需要特别说一下预添加的执行顺序问题
        //它这里也采取了队列的性质,不过,预添加与原本的的队列相比是一个反向队列
        //例如:
        // Sequence quence = DOTween.Sequence();
        //quence.Append(transform.DOMove(Vector3.one, 2));
        //quence.Prepend(transform.DOMove(-Vector3.one * 2, 2));
        //quence.PrependInterval(1);
        //执行顺序是 PrependInterval----Prepend---- - Append
         //就是最后添加的会在队列的最顶端
      //6)预添加时间间隔
        quence.PrependInterval(1);
        // 回调函数
        // 1)预添加回调
        quence.PrependCallback(
            () => { Destroy(gameObject); }
        );
      // 2)在规定的时间点加入回调
        quence.InsertCallback(1, 
            () => { Destroy(gameObject); }
         );
        //3)添加回调
        quence.AppendCallback(
            ()=>{ Destroy(gameObject); }
        );
    }
    //(6) Tweener的设置
    private void SetterTweener()
    {
        TweenParams para = new TweenParams();
        // 1)设置动画循环
        // 第一个参数是循环次数 - 1代表无限循环
        // 第二个参数是循环方式
        //  Restart 重新开始
        //  Yoyo 从起始点运动到目标点,再从目标点运动回来,这样循环
        //Incremental   一直向着运动方向运动
        para.SetLoops(-1, LoopType.Yoyo);
        //2)设置参数
        transform.DOMove(Vector3.one, 2).SetAs(para);
        //3)设置自动杀死动画
        transform.DOMove(Vector3.one, 1).SetAutoKill(true);
        //4)from补间
        //  例如;
        transform.DOMove(Vector3.one, 2).From(true);
        //From参数 isRelative(相对的):
        //为true,传入的就是偏移量,即当前坐标 + 传入值 = 目标值
        //为falese,传入的就是目标值,即传入值 = 目标值
        //5)设置动画延时
        transform.DOMove(Vector3.one, 2).SetDelay(1);
        //6)设置动画运动以速度为基准 例如:
        transform.DOMove(Vector3.one, 1).SetSpeedBased();
        //使用SetSpeedBased时,移动方式就变成以速度为基准
        //原本表示持续时间的第二个参数,就变成表示速度的参数,每秒移动的单位数
        //7)设置动画ID
        transform.DOMove(Vector3.one, 2).SetId("Id");
        //8)设置是否可回收
        //  为true的话,动画播放完会被回收,缓存下来,不然播完就直接销毁
        transform.DOMove(Vector3.one, 2).SetRecyclable(true);
        //9)设置动画为增量运动
        //例如:
        transform.DOMove(Vector3.one, 2).SetRelative(true);
        //SetRelative参数 isRelative(相对的):
        //为true,传入的就是偏移量,即当前坐标 + 传入值 = 目标值
        //为falese,传入的就是目标值,即传入值 = 目标值
        //10)设置动画的帧函数
        //例如:
        transform.DOMove(Vector3.one, 2).SetUpdate(UpdateType.Normal, true);
        //第一个参数 UpdateType :选择使用的帧函数
        //UpdateType.Normal:更新每一帧中更新要求。 
        //UpdateType.Late:在LateUpdate调用期间更新每一帧。 
        //UpdateType.Fixed:使用FixedUpdate调用进行更新。 
        //UpdateType.Manual:通过手动DOTween.ManualUpdate调用进行更新。
        //第二个参数:为TRUE,则补间将忽略Unity的Time.timeScale
    }
    //(7) 运动曲线的设置
    private void TestEaseFuncAnima()
    {
        //关于Ease缓动函数的说明
        /*
         * 基本概念说明:
         * 缓动函数是指动画效果在执行时的速度,使其看起来更加真实。
         * Ease.InSine 表示正弦加速动作
         * Ease.OutSine 表示正弦减速动作
         * Ease.InOutSine 表示正弦加速减速动作
         * 每个效果都分3种缓动方式:
         * (1).easeIn:从0开始加速的缓动
         * (2).easeOut:减速到0的缓动
         * (3).easeInOut:前半段从0开始加速,后半段减速到0的缓动
         * 其中Linear是线性缓动,也叫无缓动效果,没有上述说明中的效果。
         */
        //线性缓动,匀速运动
        //transform.DOMove(new Vector3(0, 5, 0), 2).SetRelative().SetLoops(-1, LoopType.Yoyo).SetEase(Ease.Linear);
        //先快后慢正弦运动
        transform.DOMove(new Vector3(0, 5, 0), 2).SetRelative().SetLoops(-1, LoopType.Yoyo).SetEase(Ease.InOutSine);
    }
   //(8) 动画回调事件
    private void TestCallBack()
    {
        //1)动画完成回调
        transform.DOMove(Vector3.one, 2).OnComplete(() => { });
        //2)动画被杀死时回调
        transform.DOMove(Vector3.one, 2).OnKill(() => { });
        //3)动画播放时回调,暂停后重新播放也会调用
        transform.DOMove(Vector3.one, 3).OnPlay(() => { });
        //4)动画暂停时回调
        transform.DOMove(Vector3.one, 2).OnPause(() => { });
        //5)动画回退时回调
        //  以下情况会被调用
        //使用DORestart重新播放时
        //使用Rewind倒播动画完成时
        //使用DOFlip翻转动画完成时
        //使用DOPlayBackwards反向播放动画完成时
        transform.DOMove(Vector3.one, 2).OnRewind(() => { });
        //6)只在第一次播放动画时调用,在play之前调用
        transform.DOMove(Vector3.one, 2).OnStart(() => { });
        //7)完成单个循环周期时触发
        transform.DOMove(Vector3.one, 2).OnStepComplete(() => { });
        //8)帧回调
        transform.DOMove(Vector3.one, 2).OnUpdate(() => { });
       
        //9)在路径动画时,改变目标点时的回调,参数为当前目标点的下标
        transform.DOMove(Vector3.one, 2).OnWaypointChange((value) => { });
    }
    //(9) 动画控制方法
    private void TestAnimatorController()
    {
        //1)播放
        transform.DOPlay();
        //2)暂停
        transform.DOPause();
       // 3)重播
        transform.DORestart();
       // 4)倒播,此方法会直接退回起始点
        transform.DORewind();
       // 5)平滑倒播,此方法会按照之前的运动方式从当前位置退回起始点
        transform.DOSmoothRewind();
       // 6)杀死动画
        transform.DOKill();
       // 7)翻转补间的方向
        transform.DOFlip();
       // 8)跳转时间点
       //   第一个参数跳转的时间点,第二个参数是跳转后是否播放动画
        transform.DOGoto(1.5f, true);
       // 9)反向播放动画
       //   反向播放动画,在动画播放到一半时执行,会退回起始点,在一开始执行看不到效果是因为,物体本身就在起始点
        transform.DOPlayBackwards();
      // 10)正向播放动画
      //    正向播放动画
        transform.DOPlayForward();
      //  11)TogglePause
     //     当暂停时,执行就继续播放,播放时,执行就暂停
        transform.DOTogglePause();
    }
    private void GetTweenerDat()
    {
        // 一、类方法
        //1)返回所有暂停的动画,没有则返回null
        DOTween.PausedTweens();
        //2)返回所有真正播放的动画,没有则返回null
        DOTween.PlayingTweens();
        //3)获取给定ID的数组
        //例如:
        DOTween.TweensById("id", true);
        //返回满足条件的动画数组
        //第一个参数是动画的ID
        //第二个参数是是否只收集正在播放的动画
        //4)返回给定对象的数组
        //例如:
        DOTween.TweensByTarget(transform, true);
        //返回满足条件的动画数组
        //第一个参数是播放动画的对象
        //例如:transform.DOMove(Vector3.one, 2); 第一个参数就传入transform
        //     material.DOColor(Color.White, 2); 第一个参数就传入材质对象material
        //第二个参数是是否只收集正在播放的动画
        //5)收集传入的对象是否有动画在活动
        //例如:
        DOTween.IsTweening(transform);
        //第一个参数为检测的对象
        //第二个参数为是否检测动画在播放状态
        //为true时,给定对象在播放状态时 返回true
        //为false时,只检测给定对象是否有动画(在pause状态时也算)有则返回true
        // 6)正在播放的动画的总数,目前处于延迟播放状态的动画也算
        DOTween.TotalPlayingTweens();
        // 二、实例方法
        _tweener = transform.DOMove(Vector3.one, 2);
        //1)表示动画执行时间的属性,可读可写
        _tweener.fullPosition = 1;
        // 2)表示动画执行完的次数
        _tweener.CompletedLoops();
        // 3)获取动画的延迟时间
        _tweener.Delay();
        // 4)获取动画的持续时间
        //   参数为true 表示计算循环的时间,无限循环为Infinity
        _tweener.Duration(false);
        //5)动画已播放的时间
        //  参数为true 表示计算循环的时间
        _tweener.Elapsed();
        //6)返回动画进度的百分比
        //  起始点为0 目标点为1 当yoyo循环模式下,值会从0变到1再从1变到0
        _tweener.ElapsedDirectionalPercentage();
        //7)返回动画区间已用的百分比
        //单次循环的数值为0到1
        //参数为 是否包含循环 为true时 返回值是循环总区间的已用百分比 若为无限循环 返回值为0
        _tweener.ElapsedPercentage(true);
        //8)动画是否在活动
        _tweener.IsActive();
        // 9)是否是反向动画
        _tweener.IsBackwards();
        //10)动画是否完成
        _tweener.IsComplete();
        //11)是否以初始化
        _tweener.IsInitialized();
        //12)是否正在播放
        _tweener.IsPlaying();
        //13)返回循环次数,  无限循环为Infinity
        _tweener.Loops();
    }
    //协程方法
    private IEnumerator Wait()
    {
        _tweener = transform.DOMove(Vector3.one, 2);
        // 1)等待动画执行完
        yield return _tweener.WaitForCompletion();
        //2)等待指定的循环次数
        //参数为执行次数,等待传入的循环次数后,继续执行
        //若是传入的次数大于动画的循环次数 则在动画结束时继续执行
        yield return _tweener.WaitForElapsedLoops(2);
        //3)等待动画被杀死
        yield return _tweener.WaitForKill();
        //4)等待动画执行指定时间
        //参数为时间,动画执行传入的时间之后或动画执行完毕,继续执行
        yield return _tweener.WaitForPosition(0.5f);
        //5)等待动画回退
        //  以下情况会继续执行函数
        //使用DORestart重新播放时
        //使用Rewind倒播动画完成时
        //使用DOFlip翻转动画完成时
        //使用DOPlayBackwards反向播放动画完成时
        yield return _tweener.WaitForRewind();
        // 6)等待Start执行后继续执行
        yield return _tweener.WaitForStart();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DoTween使用 的相关文章

  • Unity中级客户端开发工程师的进阶之路

    上期UWA技能成长系统之 Unity高级客户端开发工程师的进阶之路 得到了很多Unity开发者的肯定 通过系统的学习 可以掌握游戏性能瓶颈定位的方法和常见的CPU GPU 内存相关的性能优化方法 UWA技能成长系统是UWA根据学员的职业发展
  • FBX导入Unity中模型没有材质的处理

    一 3dMax导出FBX时的注意事项 导出时 确保maps文件存在 里面放着fbx用到的image 二 在Unity中的设置 1 文件拖入Unity的Assets文件夹中 2 查看模型的材质是否存在 如下所示 材质为None 此时拖入sce
  • Unity Shader入门精要第七章 基础纹理之遮罩纹理

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 一 实践 参考 前言 遮罩纹理 mask texture 是本章要介绍的最后一种纹理 它非常有用 在很多商业游戏中 都可以见到它的身影 那么什么是遮罩呢 简单来讲 遮罩允许我们
  • Unity中按钮检测鼠标状态

    改方法主要是用于按钮检测鼠标的进入 滑出 点击 抬起 长按 长按停止 1 先将下面这个脚本挂载到需要检测鼠标状态的按钮上 using System Collections using System Collections Generic u
  • Unity中UI框架的使用1-添加面板、显示Loading页面

    其中BasePanel和Canvas都是挂在面板的预制物上的 1 导入我们的UI框架 本篇文章中有用的是两个UIPanelType NUIManager和NBasePanel 会放在文章最后供大家使用 2 先将我们做好的Panel设置成预制
  • unity中创建询问弹出窗口

    在开发过程中进程会遇到需要弹出一个窗口询问用户是否进行的操作 今天就来制作一个这样弹出窗口 然后根据弹出窗口的选择内容不同进行不同的操作 本例中主要是为了删除一个数据 而在删除数据操作前需要得到用户的一个确认操作 这里面主要用到了Notif
  • Unity学习笔记(一)—— 基础知识

    一 基础知识 1 开发团队组成 2 unity特点 图形界面 所见即所得 入门简单 支持C 比OC C 更友好 js 国内外资源丰富 因为使用的人多 跨平台性好 PC端 移动端等 对VR AR的支持最完善 3 成功案例 游戏 炉石传说 神庙
  • unity后台加密时间锁

    前言 在做一些项目的时候 有些不良甲方在给完项目后会有不给尾款的情况 之前都是加一些水印啥的 感觉不是很方便 第一不美观 第二如果甲方给完尾款后还得重新打包去水印 然后又做过一个本地的时间锁 等到时间 程序直接退出 但是感觉还是不方便 有时
  • Unity 键盘控制人物移动——之输入方式代码的编写

    键盘输入 控制人物移动 在我们制作游戏中最常见的需求之一就是使用键盘移动游戏角色 那么我们首先需要获取键盘输入 以下提供两种方法获取键盘 这里尽量通过截图解释让大家理解代码的含义 GetInput void FixedUpdate Move
  • 【Unity】按Esc进入操作菜单

    本文章是基于如下视频的自我总结 https www youtube com watch v JivuXdrIHK0 步骤如下 1 在Canvas 界面添加一个Panel Panel中添加一个按钮 调整按钮的大小为合适大小 调整字体的大小为合
  • unity实现鼠标右键控制视角

    主要实现的功能是相机跟随主角 鼠标右击移动后 相机的视角会旋转 思路 在主角里创建空的子物体 把相机绑在空物体上 通过旋转空物体来实现视角的旋转 要把相机调整到适当位置 代码如下 public float rotateSpeed 100 设
  • unity dots jobSystem 记录

    Looking for a way to get started writing safe multithreaded code Learn the principles behind our Job System and how it w
  • unity3d image组件不显示

    需要将UI组件放到画布下面
  • mixamo根动画导入UE5问题:滑铲

    最近想做一个跑酷游戏 从mixamo下载滑铲动作后 出了很多动画的问题 花了两周时间 终于是把所有的问题基本上都解决了 常见问题 1 动画序列 人物不移动 2 动画序列 人物移动朝向错误 3 蒙太奇 人物移动后会被拉回 4 蒙太奇 动画移动
  • unity小球跟随音乐节奏放大缩小和改变颜色

    放在小球身上 设置对应组件即可 using System Collections using System Collections Generic using Unity VisualScripting using UnityEngine
  • 【Unity】运行时创建曲线(贝塞尔的运用)

    Unity 运行时创建线 贝塞尔的运用 1 实现的目标 在运行状态下创建一条可以使用贝塞尔方法实时编辑的网格曲线 2 原理介绍 2 1 曲线的创建 unity建立网格曲线可以参考 Unity程序化网格体 的实现方法 主要分为顶点 三角面 U
  • 游戏开发常见操作梳理之NPC药品商店系统(NGUI版)

    后续会出UGUI Json的版本 敬请期待 游戏开发中经常会出现药品商店 实际操作与武器商店类似 甚至根据实际情况可以简化设置 废话不多说 直接上代码 药品商店的源码 using System Collections using Syste
  • 游戏开发常见操作梳理之角色选择一

    进入游戏后 我们经常会进入角色选择的界面 通常是左右两个按钮可以更改角色供玩家选择 对于这种界面我们通常使用数据持久化将角色信息存储起来 接下来的笔记中 我将使用自带的数据持久化系统对其进行操作 实现角色的选择页面 后续会更新xml系列的文
  • 游戏开发常用实践操作之按动任意键触发

    接下来一些笔记会对于一些大大小小的实践操作进行记录 希望对你有所帮助 在游戏中 我们经常会遇到一些按动任意键触发的操作 接下来展示核心代码 以下是对于Unity中的操作 使用的UI是NGUI 对于核心操作没有影响 你可以自己置换 void
  • 游戏开发常见操作系列之敌人系统的开发一(U3D)

    在开发游戏的过程中 我们常常会出现一些敌人攻击我们玩家 并且实现掉血以及死亡的现象 敌人还会源源不断地生成 这是怎么制作的呢 接下来为大家提供方法 其中使用了NGUI 后续会更新其它方法 敬请期待 使用HUDText实现扣血时显示文本 直接

随机推荐

  • AndroidStudio链接手机的步骤

    1 设置手机为开发者模式 设置 gt 关于手机 gt 连续点击MIUI版本 开启成功 2 在更多设置中选择开发者选项 在开发者选项中同时勾选USB调试和USB安装的开关 3 数据线与电脑连接 4 打开AndroidStudio 等待程序加载
  • centos7关闭防火墙

    出现物理机ping不通虚拟机 但虚拟机可以ping通物理机 排查的方向 一个是虚拟机的防火墙问题 1 查看防火墙的状态 systemctl status firewalld 2 关闭防火墙 如果还是不通 第二个排查方向是虚拟机的链接模式 桥
  • Springboot集成activiti的配置文件ActivitiConfig

    Configuration public class ActivitiConfig Bean public ProcessEngineConfiguration processEngineConfiguration DataSource d
  • Stable Diffusion教程

    什么是Stable Diffusion Stable Diffusion是一种潜在扩散模型 Latent Diffusion Model 能够从文本描述中生成详细的图像 它还可以用于图像修复 图像绘制 文本到图像和图像到图像等任务 简单地说
  • radius认证服务

    radius认证服务 RADIUS是一种分布的 客户端 服务器系统 实现安全网络 反对未经验证的访问 在cisco实施中 RADIUS客户端运行在cisco路由器上上 发送认证请求到中心RADIUS服务器 服务器上包含了所有用户认证和网络服
  • cuda测试集编译linux,linux下使cmake编译cuda(附列子,亲测可用)

    在网上百度 并没有找到什么合适的教程 让我等小白着急不已 借助于GOOGLE的强大能力 发现原来cmake已经支持了cuda 于是乎 赶紧 http www cmake org 下载了最新的cmake 调用了里面的一个FindCUDA cm
  • ApiPost 开源接口调试工具使用大全

    ApiPost使用 简介 接口调试 API请求参数 Header 参数 Query 参数 Body 参数 API 请求响应 返回Headers 响应结果分屏展示 生成调试代码 参数 全局参数 目录参数 参数的优先级 变量 环境变量 环境变量
  • 运行 AppImage软件:Running AppImages (***)

    How to run an AppImage Running AppImages 使用 AppImage appImagetool 进行 Linux 软件包管理 带笔记 要点 1 需要运行权限 通常 linux软件的运行 都需要运行权限 B
  • 基于OpenCASCADE自制三维建模软件(一)介绍

    一 制作背景 目前工作的项目中 需要三维建模作为其中一个模块 而本人刚接触三维建模 因而借助制作一个简单的三维建模软件学习相关的知识 并在此作笔记 在调研过程中 我了解到开源的Open CASCADE软件平台 Open CASCADE简称O
  • ChatGPT 类 AI 软件供应链的安全及合规风险

    AIGC将成为重要的软件供应链 近日 OpenAI推出的ChatGPT通过强大的AIGC 人工智能生产内容 能力让不少人认为AI的颠覆性拐点即将到来 基于AI将带来全新的软件产品体验 而AI也将会成为未来软件供应链中非常重要的一环 在Ope
  • colab 导出csv文件

    生成之后download即可 from google colab import files files download train csv
  • 使用nodejs接入封装第三方短信验证码工具类

    简介 使用nodejs接入封装第三方短信验证码工具类 第三方短信运营商接入 安装axiosyarn add axios 1 1 3 配置 在项目的config文件夹新建一个文件 命名为接入短信验证码平台的名字 例如aliyunMessage
  • js实现5秒后跳转页面

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一 使用js代码实现延时跳转 二 使用步骤 1 定时器 setInterval 2 location跳转 3 整体实现 总结 提示 以下是本篇文章正文内容 下面案例
  • 数据结构之 栈(C语言实现)

    数据结构之 栈 C语言实现 1 栈的模型 栈 stack 是限制插入和删除只能在一个位置上进行的表 该位置是表的末端 叫做栈的顶 top 对栈的基本操作有push 进栈 和pop 出栈 前者相当于插入 后者则是删除最后插入的元素 最后插入的
  • Shell脚本攻略:Linux防火墙(一)

    目录 一 理论 1 安全技术 2 防火墙 3 通信五元素和四元素 4 总结 二 实验 1 iptables基本操作 2 扩展匹配 3 自定义链接 一 理论 1 安全技术 1 安全技术 入侵检测系统 Intrusion Detection S
  • 一分钟秒懂公有云、私有云、混合云......

    近几年随着云计算技术的逐渐普及 越来越多的企业开始选择了部署云计算方案 当运营赖于数据结构和网络管理业务时 云计算的灵活性 易用性 定制性给企业带来的优势是毋庸置疑的 但是公有云 私有云 混合云等等到底都是什么呢 公有云 私有云 混合云 这
  • NPOI 单元格设置边框

    很多表格中都要使用边框 本节将为你重点讲解NPOI中边框的设置和使用 边框和其他单元格设置一样也是调用ICellStyle接口 ICellStyle有2种和边框相关的属性 分别是 边框相关属性 说明 范例 Border 方向 边框类型 Bo
  • SourceInsight保存文件时自动去除多余的空格

    在用source insight 写代码后提交git 如果有一些多余的空格不删除就提交会出现标红的界面 在source insight 中可以设置保存时自动去除多余的空格 Options gt gt Files gt gt Remove e
  • Yahoo(雅虎)宣布停止开发YUI

    转载至 http www infoq com cn news 2014 09 yahoo drop axe YUI utm campaign infoq content utm source infoq utm medium feed ut
  • DoTween使用

    using System Collections using UnityEngine using DG Tweening using UnityEngine UI DOTween真的比iTween好很多 1 编写方面更加人性化 2 效率高很