Unity3D从入门到放弃(七) ----DoTween的实现

Unity3D 从入门到放弃 ——巡逻兵 观察者模式 Unity3D 从入门到放弃——巡逻兵作业需求游戏规则: 创建一个地图和若干巡逻兵; 每个巡逻兵走一个3~5个边的凸多边型,位置数据是相对地址。即每次确定下一个目标位置,用自己当前位置为原点计算; 巡逻兵碰撞到障碍物如树,则会自动选下一个点为目标; 巡逻兵在设定范围内感知到玩家,会自动追击玩家; 失去玩家目标后,继续巡逻; 计分:每次甩掉一个巡逻兵计一分,与巡逻兵碰撞游戏结束; 先上UML图: 做 阅读详情

Unity3D从入门到放弃(七)

—-DoTween的实现


5.11修改:在Sequence里面新加入了Clear函数,目的是清除Sequence里List中的Tween。


作业要求:

请研究 DOTween 网站 http://dotween.demigiant.com/getstarted.php 网页, 它在 Specific settings 中 transform.DoMove 返回 Tween 对象。请实现该对象,实现对动作的持续管理。

本次作业要求完成DOTween实现的内容,DOTween网站已经放在上面。下面简介实现思路和具体实现。

实现思路:

观察了网站的DOTween运作并自己操作了一下,我猜测DOTween的运作模式为:创建一个空物体挂在的脚本,然后在该脚本上进行Tweener和Sequence的操作,并对他们进行管理和操作,而静态类DOTween对该脚本的函数进行封装,供用户使用。


(新建Tween出现的脚本)

这里写图片描述
(脚本信息)

Tween的另一个问题是如何修改函数的值,经过查资料,我了解了Tween的To函数通过getter和setter函数实时改变相应的值,因此我新加入了一个委托change,用于通过时间和插值函数,计算相应的中间值。

这里写图片描述

Tween第三个问题是如何执行,用Coroutine(协程)可以轻松解决这个问题,协程在每一帧自动从yield重新开始,可以代替Update。

根据这三个信息,可以构造简易DOTween了。


具体实现:

1.类结构如下

这里写图片描述

(其中ExtendClassFunction文件,包含各种静态类,每个静态类包含相应类的扩展函数)


2.代码如下

代码我会贴在下面,也可以从GitHub上下载,链接:我是下载传送门

LerpFunction:(插值函数类,半搬运半修改)

/*
 * 描 述:存放各种插值函数的类
 * 作 者:hza 
 * 创建时间:2017/05/07 00:48:02
 * 版 本:v 1.0
 */
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace My.LerpFunctionSpace
{
    // Lerp函数类型
    public enum LerpFunctionType : int
    {
        Linear = 0,
        QuadIn = 1,
        QuadOut = 2,
        QuadBoth = 3,
        CubicIn = 4,
        CubicOut = 5,
        CubicBoth = 6,
        QuintIn = 7,
        QuintOut = 8,
        QuintBoth = 9,
        SineIn = 10,
        SineOut = 11,
        SineBoth = 12,
        ExpoIn = 13,
        ExpoOut = 14,
        ExpoBoth = 15,
        CircIn = 16,
        CircOut = 17,
        CircBoth = 18,
        ElasticIn = 19,
        ElasticOut = 20,
        ElasticBoth = 21,
        BackIn = 22,
        BackOut = 23,
        BackBoth = 24,
        BounceIn = 25,
        BounceOut = 26,
        BounceBoth = 27
    }

    /// <summary>
    /// 用来进行各种线性插值的计算,time必须在0-1之间
    /// </summary>
    public static class LerpFunction
    {
        #region 委托和事件数组
        public delegate float LFunction(float from, float to, float time);
        public static LFunction[] lerfs = new LFunction[]
        {
            Linear,
            QuadIn,
            QuadOut,
            QuadBoth,
            CubicIn,
            CubicOut,
            CubicBoth,
            QuintIn,
            QuintOut,
            QuintBoth,
            SineIn,
            SineOut,
            SineBoth,
            ExpoIn,
            ExpoOut,
            ExpoBoth,
            CircIn,
            CircOut,
            CircBoth,
            ElasticIn,
            ElasticOut,
            ElasticBoth,
            BackIn,
            BackOut,
            BackBoth,
            BounceIn,
            BounceOut,
            BounceBoth
        };
        #endregion

        #region 私有Lerp函数
        // 线性
        public static float Linear(float from, float to, float time)
        {
            return from + (to - from) * time;
        }

        // 2次方程
        public static float QuadIn(float from, float to, float time)
        {
            return from + (to - from) * time * time;
        }
        public static float QuadOut(float from, float to, float time)
        {
            return from + (to - from) * time * (2f - time);
        }
        public static float QuadBoth(float from, float to, float time)
        {
            return time < 0.5f ? QuadIn(from, (from + to) / 2, time * 2) : QuadOut((from + to) / 2, to, 2 * time - 1f);
        }

        // 3次方程
        public static float CubicIn(float from, float to, float time)
        {
            return from + (to - from) * Mathf.Pow(time, 3f);
        }
        public static float CubicOut(float from, float to, float time)
        {
            return from + (to - from) * (Mathf.Pow(time - 1, 3f) + 1.0f);
        }
        public static float CubicBoth(float from, float to, float time)
        {
            return time < 0.5f ? CubicIn(from, (from + to) / 2, time * 2) : CubicOut((from + to) / 2, to, 2 * time - 1f);
        }

        // 5次方程
        public static float QuintIn(float from, float to, float time)
        {
            return from + (to - from) * Mathf.Pow(time, 5f);
        }
        public static float QuintOut(float from, float to, float time)
        {
            return from + (to - from) * (Mathf.Pow(time - 1, 5f) + 1.0f);
        }
        public static float QuintBoth(float from, float to, float time)
        {
            return time < 0.5f ? QuintIn(from, (from + to) / 2, time * 2) : QuintOut((from + to) / 2, to, 2 * time - 1f);
        }

        // 正弦曲线
        public static float SineIn(float from, float to, float time)
        {
            return from + (to - from) * (1.0f - Mathf.Cos(time * Mathf.PI / 2));
        }
        public static float SineOut(float from, float to, float time)
        {
            return from + (to - from) * Mathf.Sin(time * Mathf.PI / 2);
        }
        public static float SineBoth(float from, float to, float time)
        {
            return time < 0.5f ? SineIn(from, (from + to) / 2, time * 2) : SineOut((from + to) / 2, to, 2 * time - 1f);
        }

        // 指数增长
        public static float ExpoIn(float from, float to, float time)
        {
            return time == 0.0f ? from : from + (to - from) * Mathf.Pow(2f, 10f * (time - 1f));
        }

        public static float ExpoOut(float from, float to, float time)
        {
            return time == 1.0f ? to : from + (to - from) * (1f - Mathf.Pow(2f, -10f * time));
        }

        public static float ExpoBoth(float from, float to, float time)
        {
            return time < 0.5f ? ExpoIn(from, (from + to) / 2, time * 2) : ExpoOut((from + to) / 2, to, 2 * time - 1f);
        }

        // 圆周弧线
        static float CircIn(float from, float to, float time)
        {
            return from + (to - from) * (1.0f - Mathf.Sqrt(1f - time * time));
        }
        static float CircOut(float from, float to, float time)
        {
            return from + (to - from) * Mathf.Sqrt((2f - time) * time);
        }
        static float CircBoth(float from,
Unity3D 从入门到放弃(六)-----巡逻兵 Unity3D 从入门到放弃(六)—–巡逻兵2017.5.9修改:修改了UML图。作业需求 游戏规则: 创建一个地图和若干巡逻兵; 每个巡逻兵走一个3~5个边的凸多边型,位置数据是相对地址。即每次 确定下一个目标位置,用自己当前位置为原点计算; 巡逻兵碰撞到障碍物如树,则会自动选下一个点为目标; 巡逻兵在设定范围内感知到玩家,会自动追击玩家; 失去玩家目标后 阅读详情

相关推荐

Unity3D 从入门到放弃(五)----射箭游戏

Unity3D 从入门到放弃(五)—-射箭游戏 填坑啊填坑,每周都补上周作业,啥时候才能到头啊= = 作业需求 游戏规则: 设计一个射箭小游戏,点击鼠标射箭:  靶对象为 5 环,按环计分;  箭对象,射中后要插在靶上;  游戏仅一轮,无限 trials; 实例化部分本次作业有箭,靶两种实例,实现如下: 箭: 箭分为三个部分,箭头,箭身,箭尾。 箭头:通过一

MyCodecOdecoDecodE的博客 2181

Unity3d独立开发 - 2017年2月25日

独立开发三要素

业余独立游戏开发者-郭Cinling的博客 4557

Unity3d光影烘焙常见缺陷的解决方法【2020】

很多Unity3d初学者在烘焙场景时,由于没有经验,模型上常常出现一些怪异的"黑斑"、“撕裂”、”硬边”、“漏光”现象(如下图所示),反复调试,问题依然得不到解决,搞得精疲力尽,甚至产生了放弃的念头,本文将针对Unity3d烘焙时常见的几种“黑斑”现象进行逐一分析和图解,希望对遇到这样问题的朋友有所帮助。

leeby100的博客 2万+

【Unity3D基础2-2】认识Unity3D引擎

一、引言 【Unity3D基础2-1】Unity3D从业介绍已更新完毕 这篇介绍Unity3D引擎 二、

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 5498

【Unity精品插件】Unity DOTween:简化动画流程的神器

DOTween是Unity中一个非常流行的第三方动画库,它提供了一种简单、高效且易于使用的方式来制作动画和过渡效果。DOTween代表"DOTween for Unity",是一个独立于Unity内置动画系统的解决方案。本文将介绍DOTween的基本概念、特性、以及如何使用DOTween来实现动画。

Unity打怪升级 990

【电弧故障检测算法全解析,电弧串扰问题分析和解决算法】

本文系统分析了电弧故障检测算法及串扰问题解决方案。电弧检测主要采用时频域分析和机器学习方法,通过提取高频噪声、波形畸变等特征实现故障识别。针对电弧串扰问题,提出了自适应滤波、盲源分离和时频联合分析等算法。研究给出了Python和C语言的算法实现示例,包括高频能量检测、过零率计算和陷波滤波器设计。最后指出算法优化方向:实时性提升可采用滑动窗口FFT和硬件加速;抗干扰增强需结合硬件滤波;机器学习扩展可引入随机森林等分类器。该研究为电弧故障检测系统开发提供了完整的技术路线。

syttt的专栏 891

ANSYS Twin Builder实战:5步搞定数字孪生模型部署(附ROM配置技巧)

本文详细解析了ANSYS Twin Builder在数字孪生模型部署中的实战应用,重点介绍了ROM(降阶模型)配置技巧。通过5个关键步骤,从环境搭建到工业部署,帮助工程师高效实现高精度三维仿真到轻量化数字孪生的转化,提升预测性维护和系统仿真效率。

weixin_27330481的博客 661

axi ps读写pl_PL读写DDR:Datamover能干什么

最近发现工程项目中一直在用AXI-DMA。这玩意儿搬数据倒是没问题,就是用axi-lite配置起来非常反人类。。。简单的办法其实是用datamover ip核。这个ip核能干嘛呢。准备写个文章解析一下。由于好多feature没用过,所以仅仅看文档可能理解有误,欢迎指出错误。首先扫个盲:MM2S指的是Memory map to stream. 读DDR. S2MM指的是steam to memory...

weixin_35908791的博客 1597

手把手教你用Logisim搭建5级流水MIPS CPU(附华中科技计组实验避坑指南)

本文详细介绍了如何使用Logisim从零构建5级流水MIPS CPU,特别针对华中科技大学计算机组成原理实验提供实用指南。内容涵盖单周期CPU过渡、流水线寄存器设计、数据冒险处理等核心环节,并附有实验避坑建议和性能优化技巧,帮助学生高效完成这一挑战性项目。

weixin_42532938的博客 372

codesys多协议通信之OPC UA通信

测试不易,转载请注明出处!

weixin_44243068的博客 3637

激光雷达接收芯片选型指南:APD、SiPM、SPAD阵列的优缺点对比

本文深入对比了激光雷达接收芯片APD、SiPM和SPAD阵列的核心技术原理与性能差异。APD作为线性模式工作的稳健选择,动态范围大;SiPM具备单光子探测和高增益优势;而SPAD阵列凭借像素级数字读出和集成TDC,在时间分辨率与系统集成度上领先。文章从灵敏度、时间精度、动态范围及系统成本等多维度剖析,为不同应用场景(如车载雷达、Flash LiDAR、消费电子)的芯片选型提供实战指南。

ik6789012的博客 656

【异常】Antigravity IDE 登录异常与网络连接错误排查指南

在使用 Google 推出的 AI 原生 IDE时,部分用户可能会遇到身份验证失效与网络环境冲突导致的叠加错误。本文将针对此类典型故障提供完整的解决思路。

奶爸的编程之路,也就一周冷个三天 1717

手把手教程 | 使用 apktool 修改已发布 APK 的版本号与版本名称

摘要:本文介绍如何使用apktool工具直接修改APK版本信息,适用于版本回滚、多版本测试等场景。详细步骤包括反编译APK、修改版本号、重打包、对齐优化和重新签名,并分享了反编译相关实用知识。该方法无需源代码参与,但需注意修改后的APK必须重新签名才能安装。最后强调应在合法范围内使用反编译技术。

学无止境 826

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

上一篇: Unity3D 从入门到放弃(六)-----巡逻兵
下一篇: (Verilog)单周期CPU设计
MyCodecOdecoDecodE
博客等级 码龄10年 66粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值