当前位置:首页 > 技术 > 正文内容

Unity动画与UI操作技巧记录

访客 技术 2026年6月11日 1

使用DOTween实现复杂动画序列

通过DOTween库可构建多步骤动画流程,支持旋转、位移、缩放、摄像机视角调整等复合效果。


function playComplexAnimation()
    local startPostion = go.transform.position
    local sequence = DG.Tweening.DOTween.Sequence()

    -- 1. 旋转360度(快速绕过360)
    sequence:Append(go.transform:DORotate(Vector3(0, 0, 360), 1, DG.Tweening.RotateMode.FastBeyond360))

    -- 2. 摇晃位置
    sequence:Join(go.transform:DOShakePosition(2, Vector3.New(2, 2, 3)))

    -- 3. 跳跃移动至目标点
    sequence:Append(go.transform:DOJump(Vector3.New(startPostion.x + 100, startPostion.y, startPostion.z), 5, 3, 3))

    -- 4. 多段线性位移,不同缓动函数
    sequence:Append(go.transform:DOMove(Vector3.New(20, 20, 30), 2)):SetEase(DG.Tweening.Ease.Linear)
    sequence:Append(go.transform:DOMove(Vector3.New(70, 80, 30), 2)):SetEase(DG.Tweening.Ease.OutQuad)
    sequence:Append(go.transform:DOMove(Vector3.New(120, 120, 30), 2)):SetEase(DG.Tweening.Ease.InOutCubic)
    sequence:Append(go.transform:DOMove(Vector3.New(200, 200, 30), 2)):SetEase(DG.Tweening.Ease.InCirc)

    -- 5. 沿路径移动(局部坐标路径)
    local cityScene = GameObject.FindWithTag("cityScene").transform
    local house = cityScene:FindChild("house").gameObject
    local pathPoints = {
        Vector3.New(17, 10, 5.7),
        Vector3.New(1, 10, 0),
        Vector3.New(1, 10, 20),
        Vector3.New(11, 10, 10)
    }
    sequence:Append(house.transform:DOLocalPath(pathPoints, 12, DG.Tweening.PathType.Linear, DG.Tweening.PathMode.Full3D, 10, nil))

    -- 6. 摄像机转向目标点
    sequence:Append(self.worldCamera.transform:DOLookAt(Vector3.New(0, 1, 0), 20, DG.Tweening.AxisConstraint.Y))

    -- 7. 执行并设置完成回调
    sequence:Play()
    sequence:OnComplete(function()
        logWarn("动画全部执行完毕")
    end)
end

动态修改RectTransform布局参数

直接通过脚本控制UI元素的锚点、偏移量和尺寸,适用于动态布局或交互反馈。


function updateRectTransform()
    local rectTransform = targetObject:GetComponent('RectTransform')

    -- 改变顶部边界
    rectTransform.offsetMax = Vector2.New(0, 0)

    -- 改变底部边界
    rectTransform.offsetMin = Vector2.New(0, 0)

    -- 修改宽高
    rectTransform.sizeDelta = Vector2.New(200, 100)

    -- 设置位置(2D/3D)
    rectTransform.anchoredPosition = Vector2.New(50, 30)
    rectTransform.anchoredPosition3D = Vector3.New(50, 30, 0)
end

嵌套动画与回调控制

在动画链中插入子动画,并在主序列完成后触发后续行为。


function setupNestedAnimation()
    local startY = VectorPos.y
    local tweener = go.transform:DOMoveY(startY, 3):SetEase(DG.Tweening.Ease.InOutSine)

    local function onCompleteCallback()
        logWarn("Y轴移动完成")
        tweener:Pause()
        go.transform:DOScale(3, 1)
        go.transform:DOMoveY(0, 1.5):SetEase(DG.Tweening.Ease.OutBounce)
    end

    local sequence = DG.Tweening.DOTween.Sequence()
    sequence:Append(go.transform:DOMoveX(VectorPos.x + 75, 1.5):SetEase(DG.Tweening.Ease.OutSine))
    sequence:Append(go.transform:DOMoveX(VectorPos.x - 75, 1.5):SetEase(DG.Tweening.Ease.InSine))
    sequence:Play()
    sequence:OnComplete(onCompleteCallback)
end

基于射线检测的物体移动与寻路

结合物理射线检测与A*算法实现可交互建筑移动逻辑。


function testMove(pos)
    if self.testAstae then
        local ray = self.componentCamera:ScreenPointToRay(pos)
        local layerMask = 2 ^ LayerMask.NameToLayer('TerrainLayer')
        local hit, result = UnityEngine.Physics.Raycast(ray, nil, 5000, layerMask)

        if hit then
            local touchPoint = result.point
            local originalPos = self.testAstae.transform.position
            self.testAstae.transform.position = touchPoint
            local localTouch = self.testAstae.transform.localPosition

            -- 回退原位置
            self.testAstae.transform.position = originalPos

            -- 遍历可放置区域判断是否命中
            for i = 1, #self.touchPaceTable do
                local info = self.touchPaceTable[i]
                local contains, targetPos = self:Contains(localTouch, info["pos"])
                if contains then
                    if self.toolAstar then
                        local from = Vector3.New(localTouch.x, localTouch.z, 0)
                        local to = Vector3.New(targetPos.x, targetPos.z, 0)
                        self.toolAstar:moveToward(from, to)
                    end
                    break
                end
            end
        end
    end
end

路径动画配置选项

使用DOPath创建平滑路径动画,并可自定义行为选项。


Vector3[] path = new Vector3[] {
    new Vector3(1, 2, 2),
    new Vector3(8, 0, 4),
    new Vector3(9, 2, 14),
    new Vector3(5, 4, 10),
    new Vector3(2, 4, 4)
};

// 使用CatmullRom生成平滑曲线路径
Tweener tween = target.DOPath(path, 2.0f, PathType.CatmullRom);

// 可选:自动返回起点
tween.SetOptions(true);

// 可选:仅限制某轴运动(如仅允许Z轴变化)
tween.SetOptions(true, AxisConstraint.Y);

// 可选:让对象始终朝向路径前进方向
tween.SetLookAt(target.transform.position);
标签: DOTweenUnity

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。