开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

项目源码

关注:1356

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

查看: 1303|回复: 26

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

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

23

主题

231

帖子

1648

积分

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

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

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

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

x
为了实现场景里面的画弧线的问题,我回顾了一下贝塞尔画线的知识,有所理解,马上开刷: 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).txt (49 Bytes, 下载次数: 36, 售价: 5 蛮牛币)
[发帖际遇]: 夜空星灿烂 被钱袋砸中进医院,看病花了 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

7日久生情
2530/5000
排名
3293
昨日变化
2

2

主题

1779

帖子

2530

积分

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

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

回复

使用道具 举报

4四处流浪
340/500
排名
11393
昨日变化
176

0

主题

162

帖子

340

积分

Rank: 4

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

回复 支持 反对

使用道具 举报

5熟悉之中
644/1000
排名
4468
昨日变化
25

0

主题

208

帖子

644

积分

Rank: 5Rank: 5

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

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1468/1500
排名
4990
昨日变化
36

0

主题

1057

帖子

1468

积分

Rank: 6Rank: 6Rank: 6

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

回复 支持 反对

使用道具 举报

7日久生情
1594/5000
排名
2944
昨日变化
20

28

主题

750

帖子

1594

积分

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

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

回复

使用道具 举报

5熟悉之中
964/1000
排名
3422
昨日变化
3

1

主题

367

帖子

964

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

7日久生情
2043/5000
排名
3701
昨日变化
1

7

主题

1090

帖子

2043

积分

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

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

回复

使用道具 举报

7日久生情
1619/5000
排名
3197
昨日变化
8

7

主题

687

帖子

1619

积分

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

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

回复

使用道具 举报

5熟悉之中
566/1000
排名
35798
昨日变化
14

0

主题

321

帖子

566

积分

Rank: 5Rank: 5

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

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1004/1500
排名
4415
昨日变化
26

11

主题

240

帖子

1004

积分

Rank: 6Rank: 6Rank: 6

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

回复 支持 反对

使用道具 举报

2初来乍到
114/150
排名
15644
昨日变化
6

0

主题

50

帖子

114

积分

Rank: 2Rank: 2

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

回复

使用道具 举报

2初来乍到
114/150
排名
15644
昨日变化
6

0

主题

50

帖子

114

积分

Rank: 2Rank: 2

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

回复 支持 反对

使用道具 举报

7日久生情
2450/5000
排名
3402
昨日变化
17

0

主题

1755

帖子

2450

积分

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

UID
219676
好友
0
蛮牛币
2306
威望
0
注册时间
2017-7-12
在线时间
319 小时
最后登录
2018-4-26

活力之星

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

回复

使用道具 举报

5熟悉之中
518/1000
排名
5803
昨日变化
44

8

主题

133

帖子

518

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

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

本版积分规则

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