前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >unity3d:路径点移动,使用dotween(模拟蝴蝶飞舞)

unity3d:路径点移动,使用dotween(模拟蝴蝶飞舞)

作者头像
立羽
发布于 2023-08-24 06:51:44
发布于 2023-08-24 06:51:44
87000
代码可运行
举报
文章被收录于专栏:Unity3d程序开发Unity3d程序开发
运行总次数:0
代码可运行

设置路径点

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class WaypointsManager : MonoBehaviour {

    Transform[] waypoints;

	// Use this for initialization
	void Start () {
        waypoints = new Transform[transform.childCount];
        int index = 0;
        foreach (Transform t in transform)
        {
            waypoints[index] = t;
            index++;
        }
    }

    public Transform getNextWayPt()
    {
        if (waypoints != null && waypoints.Length > 0)
        {
            int index = Random.Range(0, waypoints.Length);
            Debug.Log("index:" + index);
            if(index == waypoints.Length)
            {
                index--;
            }
            return waypoints[index];
        }
        else
        {
            return null;
        }
    }
    
}

目标上挂脚本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using UnityEngine;
using System.Collections;
using DG.Tweening;

public class ButterFlyController : MonoBehaviour {

    public Transform selfObj;
    public Transform target;
    Rigidbody rigid;
    ButterFlyAnimationController bfAnimController;
    float turningFactor = 0.6f;
    //float movingSpeed = 1f;
    float landingDist = 1f;

    float step = 0.3f;
    float movingDuration = 0.1f;
    float turningDuration = 0.1f;

    public SphereCollider myCollider;
    public WaypointsManager wayPtsManager;
    float staticRadius = 1.3f;
    float flyingRadius = 2.2f;
    int castLayerMask;
    int handLayerIndex;
    Sequence currentSeq;
    Vector3 avoidDir = Vector3.zero;
    int landingSpotsLayer;
    const int subseqCycle = 3;
    int randSubseqCount = subseqCycle;
    bool isTakingOff = false;

    public bool testFly;

    // Use this for initialization
    void Start () {
        myCollider.radius = staticRadius;
        bfAnimController = GetComponent<ButterFlyAnimationController>();
        rigid = GetComponent<Rigidbody>();
        landingSpotsLayer = LayerMask.NameToLayer("landingSpots");
        handLayerIndex = LayerMask.NameToLayer("Hands");
        castLayerMask = ~(1 << landingSpotsLayer);
        bfAnimController.idle();

        if (testFly)
            Invoke("chooseTargetAndTakeOff", 3);

    }

    // Update is called once per frame
    void Update() {
        //random Idle behaviour
        if(!bfAnimController.isFlying() && !bfAnimController.isPrepareToIdle())
        {
            if (Random.Range(0, 10000) > 9900)
            {
                if (randSubseqCount == 0) {
                    randSubseqCount = subseqCycle;
                    bfAnimController.idle();
                }

                randSubseqCount--;
            }
        }

        if(bfAnimController.isFlying())
            myCollider.radius = flyingRadius;
        else
            myCollider.radius = staticRadius;

        //if (!bfAnimController.isFlying())
        //{
        //    chooseTargetAndTakeOff();
        //}

    }

    public void takeOff() {
        bfAnimController.stopIdling();
        bfAnimController.takeOff();
        Invoke("flyToTarget", 1.7f);
        isTakingOff = false;
    }


    public void flyToTarget() {
        Vector3 targetDir = (target.position - selfObj.position);
        if (targetDir.magnitude < landingDist)
        {
            if(target.gameObject.layer == landingSpotsLayer)
            {
                Debug.Log("Landing!!");
                landing();
                return;
            }
        }
        
        targetDir = targetDir.normalized;
        currentSeq = DOTween.Sequence();
        float avoidTendency = 0.65f;
        Vector3 nextDir = Vector3.Slerp(selfObj.forward,  (1- avoidTendency) * targetDir + avoidTendency * avoidDir, turningFactor).normalized;
        float forwardDampingFactor = Mathf.Max(Vector3.Dot(nextDir, selfObj.forward), 0);
        Vector3 nextPos = selfObj.position + nextDir * forwardDampingFactor * step;
        currentSeq.Append(selfObj.DOMove(nextPos, movingDuration))
                  .Join(selfObj.DOLookAt(nextPos, turningDuration))
                  .AppendCallback(flyToTarget);
    }

    float landingDuration = 0.2f;

    public void landing() {
        Sequence mySequence = DOTween.Sequence();
        Vector3 nextDir = selfObj.forward - Vector3.Dot(selfObj.forward, target.up) * target.up; 
        mySequence.Append(selfObj.DOMove(target.position + target.up * 0f, landingDuration))
                 .Join(selfObj.DOLookAt(selfObj.position + nextDir, landingDuration))
                 .AppendCallback(landed);
        Invoke("playLandingAnimation", 0.7f);
    }

    public void playLandingAnimation()
    {
        bfAnimController.land();
    }

    public void landed()
    {
        Invoke("chooseTargetAndTakeOff", Random.Range(7f, 30f));
    }

    void OnCollisionEnter(Collision collision)
    {
        //Debug.Log("Collision!" + collision.gameObject.name);
        if (!bfAnimController.isFlying())
        {
            if (collision.gameObject.layer == handLayerIndex)
            {
                chooseTargetAndTakeOff();
            }
        }
        else
        {
            if (currentSeq != null && currentSeq.IsPlaying())
            {
                avoidDir = (selfObj.position - collision.contacts[0].point).normalized;
                currentSeq.Kill();
                currentSeq = null;
                flyToTarget();
            }
        }


    }

    void OnCollisionExit(Collision collision)
    {
        avoidDir = Vector3.zero;
    }


    void chooseTargetAndTakeOff()
    {
        if (!bfAnimController.isFlying() && !isTakingOff)
        {
            isTakingOff = true;
            target = wayPtsManager.getNextWayPt();
            while(Vector3.Distance(target.position,selfObj.position) < landingDist)
            {
                target = wayPtsManager.getNextWayPt();
            }
            takeOff();
        }
    }

}

动画控制

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using UnityEngine;
using System.Collections;

public class ButterFlyAnimationController : MonoBehaviour {

    Animator animator;
    string flyingStateName = "Flying";
    string takeOffTriggerName = "TakeOff";
    string idleTriggerName = "toIdle";

    // Use this for initialization
    void Awake()
    {
        animator = GetComponent<Animator>();
    }

    public void takeOff()
    {
        animator.SetBool(flyingStateName, true);
        animator.SetTrigger(takeOffTriggerName);
    }

    public void land()
    {
        animator.SetBool(flyingStateName, false);
    }

    public void idle()
    {
        animator.SetTrigger(idleTriggerName);
    }

    public void stopIdling()
    {
        animator.SetBool(idleTriggerName, false);
    }

    public bool isPrepareToIdle()
    {
        return animator.GetBool(idleTriggerName);
    }

    public bool isFlying()
    {
        return animator.GetBool(flyingStateName);
    }



}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-03-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Unity动画☀️9. 木头自转、扛起木头、OnTriggerEnter
1️⃣ 导入木头Log,找回丢失的贴图,通过Perfab的Model—Scale Factor调节导入比例—0.3
星河造梦坊官方
2024/08/14
1300
Unity动画☀️9. 木头自转、扛起木头、OnTriggerEnter
Unity3D基础项目(四):3D坦克大战
这个游戏最初是国外的教程,后来被国内的众多机构和个人仿写推出众多的版本。但是内容原理差不多,有的是通过插件(PlayMaker,CaverAI),有的通过顶级封装简单几十行代码就搞出来。特别适合初学者总结自己的学习水平。由于教学需要,所以研究一下,仅供参考。
孙寅
2020/06/02
1.8K0
unity3d:CatmullRom采样曲线,沿着曲线移动
立羽
2023/08/24
2770
unity3d:CatmullRom采样曲线,沿着曲线移动
【Unity】3D贪吃蛇游戏制作/WebGL本地测试及项目部署
经典贪吃蛇游戏:蛇身随着吃食物的增加不断变长,通过A/D或方向键←→控制方向,蛇头撞在蛇身上或四周墙壁会导致游戏失败。
zstar
2023/10/06
9931
【Unity】3D贪吃蛇游戏制作/WebGL本地测试及项目部署
Unity3D | 经典小游戏Pacman
在学习的过程中,几个比较重要的知识点就是:预制体、克隆体、精灵渲染器、渲染层级、脚本、碰撞检测、触发检测、AI设计、UI设计、固定物理帧…
全栈程序员站长
2022/08/30
8350
Unity3D | 经典小游戏Pacman
Unity3D学习笔记8——GPU实例化(3)
在前两篇文章《Unity3D学习笔记6——GPU实例化(1)》《Unity3D学习笔记6——GPU实例化(2)》分别介绍了通过简单的顶点着色器+片元着色器,以及通过表面着色器实现GPU实例化的过程。而在Unity的官方文档Creating shaders that support GPU instancing里,也提供了一个GPU实例化的案例,这里就详细论述一下。
charlee44
2022/07/12
1.4K0
Unity3D学习笔记8——GPU实例化(3)
游戏开发者使用code buddy能做成什么样? C# Unity
其实,腾讯的code buddy (下文简称为buddy) 和现在大多数的AI辅助编程一样,都是帮助各位IT行业的小伙伴更加高效的编辑代码(make your life better ),目前是免费的阶段(**个人版免费** 企业版与专业版收费详见官网).使用方法与cursor类似.在代码编辑器扩展中安装,然后登陆账号.即可开始使用.使用是很简单的,但是如何去用,也是一门学问.
张曙光
2025/05/13
940
游戏开发者使用code buddy能做成什么样? C# Unity
Roll A Ball
//FollowPlayer(相机跟随主角)、food(控制food旋转)、Player(控制主角移动、碰撞器)
星河造梦坊官方
2024/08/14
1040
Unity开发微信跳一跳小游戏
首先建一个3D空项目,要记住项目名称不能有中文、空格、特殊字符(别问我是怎么知道的T_T)。
叶茂林
2023/07/13
3560
Unity开发微信跳一跳小游戏
unity3d:弹道飞行
立羽
2023/08/24
2810
unity3d:弹道飞行
【Unity3D】Unity 游戏画面帧更新 ( 游戏物体 GameObject 移动 | 借助 Time.deltaTime 进行匀速运动 )
在 Unity 中 , 如果想要让 游戏物体 GameObject 移动 , 则需要在 MonoBehaviour#Update() 函数 中 , 不断的修改 物体的 Transform#localPosition 坐标位置 ;
韩曙亮
2023/03/30
8610
【Unity3D】Unity 游戏画面帧更新 ( 游戏物体 GameObject 移动 | 借助 Time.deltaTime 进行匀速运动 )
unity3D读取SimpleJSON的
这个星期真是太倒霉了,得了结石了,在医院打吊针吊了3天,重要的是那个痛啊,简直是太痛了。从这点我认识到了,身体是革命的本钱,以后不管干什么,保护好自己的身体才是最重要的。好了,不聊这些了,希望这黑色的星期快点过去,。关于U3D怎么读取JSON文件,怎么解析JSON。这里我用到的是
py3study
2020/01/07
1.9K0
unity3d:悬停显示
立羽
2023/08/24
3240
Unity3d EasyAR开发案例系列教程
这篇文章介绍如何使用EasyAR.unitypackage配置EasyAR ---------- 参考资料 1、EasyAR 初学者入门指南 http://forum.easyar.cn/portal
恬静的小魔龙
2020/03/09
3K0
Unity3d EasyAR开发案例系列教程
unity3d地形系统总结
本文不是讲地形编辑器的使用,而是主要讲解(1)地形相关知识(2)使用代码创建地形(3)使用AnimationCurve创建曲面地形(4)使用photoshop绘制地形表面,即SplatAlphaMap(5)使用代码为地形添加树
py3study
2020/01/08
2.6K0
UGUI系列-实现层级菜单(Unity3D)
层级菜单在Unity中用到的并不多,主要是做分类的时候用的比较多,今天就给大家分享几个层级代码,扩充一下,写成插件也是不错的。
恬静的小魔龙
2022/08/07
1.9K0
UGUI系列-实现层级菜单(Unity3D)
Unity3D-委托使用
C#中与预定义了一个委托类型Action 它默认可以指向一个没有返回值,没有参数的方法。
孙寅
2020/06/02
4280
MMORPG游戏开发实战(一)
新建目录工程 关于工程的文件夹创建 代码注释修改 可以百度,这种代码不需要记忆。一大堆,直接用就可以 using System; using System.Collections; using System.IO; using UnityEngine; using UnityEditor; public class ScriptsCreat : UnityEditor.AssetModificationProcessor { public static void OnWillCreateAss
孙寅
2020/06/02
9760
MMORPG游戏开发实战(一)
2.5D游戏是如何做出来的呢,2.5D游戏快速制作教程
2.5D游戏 是一种介于二维和三维之间的游戏形式。它通常在二维平面上展示游戏内容,但利用三维技术来实现更加逼真的图像效果。
呆呆敲代码的小Y
2023/08/10
2.9K0
2.5D游戏是如何做出来的呢,2.5D游戏快速制作教程
学习|Unity3D使用协程实现减速停车效果
上一篇《学习|Unity3d的导航实现循环线路移动》讲了一下定制循环行驶路线的方法,在视频中还有一个就是非会员的车辆需要人工收费,所以就要有一个减速停车等待的动画效果,本篇就来讲讲怎么用Unity3d的协程来实现的这一效果。
Vaccae
2020/09/01
1.3K0
学习|Unity3D使用协程实现减速停车效果
相关推荐
Unity动画☀️9. 木头自转、扛起木头、OnTriggerEnter
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验