游戏蛮牛学习群(纯技术交流,不闲聊):159852603
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

项目源码

关注:1427

当前位置:游戏蛮牛 资源专区 项目源码

查看: 2154|回复: 28

[Unity] Unity贝塞尔弧线动画(一)

[复制链接]  [移动端链接]
7日久生情
1989/5000
排名
1187
昨日变化
1

26

主题

294

帖子

1989

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
82788
好友
20
蛮牛币
5908
威望
0
注册时间
2015-3-21
在线时间
716 小时
最后登录
2018-10-19
发表于 2018-1-11 19:08:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 夜空星灿烂 于 2018-6-29 14:21 编辑

为了实现场景里面的画弧线的问题,我回顾了一下贝塞尔画线的知识,有所理解,马上开刷: GIF3.gif GIF5.gif

1、场景创建空物体,添加组件“LineRenderer”,并添加材质到组件上
QQ截图20180111185004.png

2、再写贝塞尔曲线代码,分了两种方式去表现:
a、DrawLine :这曲线动画利用差值方式运算的



[C#] 纯文本查看 复制代码
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
 
/// <summary>
/// 贝塞尔曲线
/// </summary>
public class DrawLine : MonoBehaviour
{
    public int SectionDetail = 100;//段数  
    public List<Transform> gameOjbet_tran = new List<Transform>();
    private List<Vector3> point = new List<Vector3>();
    private LineRenderer line;
    public GameObject ball;
    public float Speed = 1;
    public float Time1 = 2f;
    private float Timer = 0;
    private int i = 1;
    // Use this for initialization
    void Init()
    {
        line = GetComponent<LineRenderer>();     
        point = new List<Vector3>();
        for (int i = 0; i < SectionDetail; i++)
        {
            //第一球
            Vector3 pos1 = Vector3.Lerp(gameOjbet_tran[0].position, gameOjbet_tran[1].position, i / 100f);
            Vector3 pos2 = Vector3.Lerp(gameOjbet_tran[1].position, gameOjbet_tran[2].position, i / 100f);
            Vector3 pos3 = Vector3.Lerp(gameOjbet_tran[2].position, gameOjbet_tran[3].position, i / 100f);
            Vector3 pos4 = Vector3.Lerp(gameOjbet_tran[3].position, gameOjbet_tran[4].position, i / 100f);
 
            //第二球
            var pos1_0 = Vector3.Lerp(pos1, pos2, i / 100f);
            var pos1_1 = Vector3.Lerp(pos2, pos3, i / 100f);
            var pos1_2 = Vector3.Lerp(pos3, pos4, i / 100f);
 
            //第三球
            var pos2_0 = Vector3.Lerp(pos1_0, pos1_1, i / 100f);
            var pos2_1 = Vector3.Lerp(pos1_1, pos1_2, i / 100f);
 
            //第四球
            Vector3 find = Vector3.Lerp(pos2_0, pos2_1, i / 100f);
 
            point.Add(find);
        }
 
    }
 
    
    //void OnDrawGizmos()//画线
    //{
    //    //Init();
    //    Gizmos.color = Color.yellow;
    //    for (int i = 0; i < point.Count - 1; i++)
    //    {
    //        Gizmos.DrawLine(point[i], point[i + 1]);
 
    //    }
    //}
    //------------------------------------------------------------------------------   
    //使小球没曲线运动
    //这里不能直接在for里以Point使用差值运算,看不到小球运算效果
    //定义一个计时器,在相隔时间内进行一次差值运算。
    void Awake()
    {
        Init();
    }
 
    void Update()
    {
       
      
        Timer += Time.deltaTime;
        if (Timer > Time1)
        {
            Timer = 0;
           
            line.positionCount = i;
            line.SetPosition(i-1, point[i]);
            ball.transform.localPosition = Vector3.Lerp(point[i - 1], point[i], 1f);
            i++;
 
            if (i >= point.Count)
            {//结束
                i = 1;
            }
 
        }
 
    }
 
}


b、BesselLine 运用贝塞尔曲线公式实现的
[C#] 纯文本查看 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class BesselLine : MonoBehaviour {
 
    public List<Transform> gameOjbet_tran = new List<Transform>();
    private List<Vector3> point = new List<Vector3>();
    public GameObject ball;
    public int SectionDetail = 100;//段数
    private LineRenderer line;
    public Color StartColor = Color.yellow;
    public Color EndColor = Color.red;
    public float StartSize = 1.0f;//开始大小
    public float EndSize = 1.0f;//结束大小
    public float Speed = 1;
    public float Time1 = 2f;
    private float Timer = 0;   
    private int i = 1;
    void Start ()
    {
        line = GetComponent<LineRenderer>();
        for (int j = 0; j < SectionDetail; j++)
        {
            float node = (float)j / SectionDetail;
            point.Add(Cala(node, gameOjbet_tran[0].position, gameOjbet_tran[1].position, gameOjbet_tran[2].position, gameOjbet_tran[3].position));
        }
       
    }
// Update is called once per frame
void Update () {
 
        //大小
        line.startWidth = StartSize;
        line.endWidth = EndSize;
        //颜色
        line.startColor = StartColor;
        line.endColor = EndColor;
        if (SectionDetail < 2)
        {
            SectionDetail = 2;
        }
        Timer += Time.deltaTime;
            if (Timer > Time1)
            {
                Timer = 0;
 
                line.positionCount = i;
                line.SetPosition(i - 1, point[i]);
               // ball.transform.localPosition = Vector3.Lerp(point[i - 1], point[i], 1f);
                i++;
 
                if (i >= point.Count)
                {//结束
                    i = 1;
                }
 
            }
        
        
        
    }
    /// <summary>
    /// 线性的贝塞尔曲线
    /// </summary>
    /// <param name="t"></param>
    /// <param name="p0"></param>
    /// <param name="p1"></param>
    /// <returns></returns>
    Vector3 Cala(float t, Vector3 p0, Vector3 p1)
    {//P = P0+ t (P1 - P0),0 <= t <= 1
        return p0 + t*(p1 - p0);
    }
    /// <summary>
    /// 二次贝塞尔曲线动
    /// </summary>
    /// <param name="t"></param>
    /// <param name="p0"></param>
    /// <param name="p1"></param>
    /// <param name="p2"></param>
    /// <returns></returns>
    Vector3 Cala(float t, Vector3 p0, Vector3 p1, Vector3 p2)
    {//  B(t) = (1-t)^2P0+ 2(1-t)tP1 + t^2P2,   0 <= t <= 1
        float u = 1 - t;
        float tt = t * t;
        float uu = u * u;
        float uuu = uu * u;
        float ttt = tt * t;
 
        Vector3 p = uu * p0;
        p += 2 * u * t * p1;
        p +=  tt * p2;      
        return p;
    }
    /// <summary>
    /// 三次贝塞尔曲线
    /// </summary>
    /// <param name="t"></param>
    /// <param name="p0"></param>
    /// <param name="p1"></param>
    /// <param name="p2"></param>
    /// <param name="p3"></param>
    /// <returns></returns>
    Vector3 Cala(float t, Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3)
    {
        float u = 1 - t;
        float tt = t * t;
        float uu = u * u;
        float uuu = uu * u;
        float ttt = tt * t;
 
        Vector3 p = uuu * p0;
        p += 3 * uu * t * p1;
        p += 3 * u * tt * p2;
        p += ttt * p3;
 
        return p;
    }
    //void OnDrawGizmos()//画线
    //{
    //    //Init();
    //    Gizmos.color = Color.yellow;
    //    for (int i = 0; i < point.Count - 1; i++)
    //    {
    //        Gizmos.DrawLine(point[i], point[i + 1]);
 
    //    }
    //}
}


3、把上面其中一段代码添加到空物体上面(我这里就放了一个代码)
QQ截图20180111185700.png

4、创建4个标志点,然后拖拽到代码“GameObject_Item”里面,运行效果






源码地址:(文本链接已经更新,可以下载了)
[hide 新建文本文档 (2) (1).txt (64 Bytes, 下载次数: 61, 售价: 5 蛮牛币)

评分

参与人数 2鲜花 +2 收起 理由
2244443244 + 1 链接失效了
bbqs1 + 1 链接失效了········

查看全部评分

[发帖际遇]: 夜空星灿烂 被钱袋砸中进医院,看病花了 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

7日久生情
1989/5000
排名
1187
昨日变化
1

26

主题

294

帖子

1989

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
82788
好友
20
蛮牛币
5908
威望
0
注册时间
2015-3-21
在线时间
716 小时
最后登录
2018-10-19
 楼主| 发表于 2018-6-29 14:27:05 | 显示全部楼层
上次不小心删了,现在地址已经更新

回复 支持 反对

使用道具 举报

7日久生情
2723/5000
排名
2958
昨日变化
10

2

主题

1840

帖子

2723

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
241666
好友
0
蛮牛币
10437
威望
0
注册时间
2017-9-6
在线时间
407 小时
最后登录
2018-10-19
发表于 2018-1-12 07:16:07 来自Mobile--- | 显示全部楼层
感谢分享

回复

使用道具 举报

5熟悉之中
517/1000
排名
9655
昨日变化
3

6

主题

211

帖子

517

积分

Rank: 5Rank: 5

UID
3354
好友
0
蛮牛币
850
威望
0
注册时间
2013-9-6
在线时间
188 小时
最后登录
2018-10-18
发表于 2018-1-12 08:46:08 | 显示全部楼层
刚好需要这个,谢谢啦

回复 支持 反对

使用道具 举报

5熟悉之中
867/1000
排名
3588
昨日变化
2

0

主题

270

帖子

867

积分

Rank: 5Rank: 5

UID
229748
好友
0
蛮牛币
2498
威望
0
注册时间
2017-7-1
在线时间
207 小时
最后登录
2018-9-27
发表于 2018-1-12 08:57:11 | 显示全部楼层
谢谢分享 非常有用

回复 支持 反对

使用道具 举报

7日久生情
2627/5000
排名
2590
昨日变化
1

0

主题

1762

帖子

2627

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
258739
好友
0
蛮牛币
5200
威望
0
注册时间
2017-12-9
在线时间
341 小时
最后登录
2018-10-19
发表于 2018-1-12 08:58:25 | 显示全部楼层
看起来很不错,感谢楼主分享!!!

回复 支持 反对

使用道具 举报

7日久生情
1971/5000
排名
1893
昨日变化
8

30

主题

792

帖子

1971

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
195974
好友
6
蛮牛币
2449
威望
0
注册时间
2016-12-24
在线时间
645 小时
最后登录
2018-10-19
发表于 2018-1-12 09:37:16 | 显示全部楼层
谢谢分享

回复

使用道具 举报

6蛮牛粉丝
1016/1500
排名
3409
昨日变化
5

1

主题

371

帖子

1016

积分

Rank: 6Rank: 6Rank: 6

UID
122160
好友
1
蛮牛币
1669
威望
0
注册时间
2015-9-10
在线时间
236 小时
最后登录
2018-8-1
发表于 2018-1-12 09:37:30 | 显示全部楼层
感谢分享
[发帖际遇]: Vincher 发帖时在路边捡到 2 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜

回复

使用道具 举报

7日久生情
2325/5000
排名
2829
昨日变化
9

11

主题

1117

帖子

2325

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
168159
好友
4
蛮牛币
5325
威望
0
注册时间
2016-9-12
在线时间
703 小时
最后登录
2018-10-19
发表于 2018-1-12 09:42:14 | 显示全部楼层
[发帖际遇]: 一个袋子砸在了 ceshi12580 头上,ceshi12580 赚了 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

7日久生情
2025/5000
排名
2099
昨日变化
6

7

主题

718

帖子

2025

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
183904
好友
6
蛮牛币
4229
威望
0
注册时间
2016-11-15
在线时间
666 小时
最后登录
2018-10-19
QQ
发表于 2018-1-12 09:54:05 | 显示全部楼层
66666666666666

回复

使用道具 举报

5熟悉之中
597/1000
排名
38193
昨日变化
14

0

主题

336

帖子

597

积分

Rank: 5Rank: 5

UID
134576
好友
0
蛮牛币
169
威望
0
注册时间
2016-1-13
在线时间
255 小时
最后登录
2018-10-15
发表于 2018-1-12 10:20:34 | 显示全部楼层
谢谢分享 非常有用

回复 支持 反对

使用道具 举报

7日久生情
1729/5000
排名
2514
昨日变化
17

13

主题

327

帖子

1729

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
217870
好友
1
蛮牛币
654
威望
0
注册时间
2017-4-15
在线时间
853 小时
最后登录
2018-10-19
发表于 2018-1-12 13:46:16 | 显示全部楼层
感谢分型,666666666666666666666666

回复 支持 反对

使用道具 举报

3偶尔光临
163/300
排名
13372
昨日变化
3

0

主题

61

帖子

163

积分

Rank: 3Rank: 3Rank: 3

UID
173414
好友
0
蛮牛币
11
威望
0
注册时间
2016-10-4
在线时间
40 小时
最后登录
2018-10-19
发表于 2018-1-12 14:38:49 | 显示全部楼层
感謝分享

回复

使用道具 举报

3偶尔光临
163/300
排名
13372
昨日变化
3

0

主题

61

帖子

163

积分

Rank: 3Rank: 3Rank: 3

UID
173414
好友
0
蛮牛币
11
威望
0
注册时间
2016-10-4
在线时间
40 小时
最后登录
2018-10-19
发表于 2018-1-12 14:53:54 | 显示全部楼层
{:86:}{:86:}{:86:}{:86:}

回复 支持 反对

使用道具 举报

7日久生情
3301/5000
排名
1941
昨日变化
7

0

主题

2122

帖子

3301

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
219676
好友
1
蛮牛币
2410
威望
0
注册时间
2017-7-12
在线时间
513 小时
最后登录
2018-10-19

活力之星

发表于 2018-1-12 18:02:53 | 显示全部楼层
谢谢分享

回复

使用道具 举报

5熟悉之中
869/1000
排名
3872
昨日变化
20

10

主题

209

帖子

869

积分

Rank: 5Rank: 5

UID
208404
好友
0
蛮牛币
3848
威望
0
注册时间
2017-2-24
在线时间
282 小时
最后登录
2018-10-19
发表于 2018-1-13 19:36:47 | 显示全部楼层
感谢分享

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表