Unity 使用LineRenderer制作模拟2d绳子

效果展示:

实现如下:

首先,直接上代码:

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LineFourRender : MonoBehaviour
{
    public Transform StartNode;

    public Transform MidNode1;
    public Transform MidNode2;

    public Transform EndNode;
    public int vertexCount = 10;

    LineRenderer lineRen;

    private void Start()
    {
        lineRen = GetComponent<LineRenderer>();
    }
    private void Update()
    {

        List<Vector3> pointList = new List<Vector3>();


        for (float ratio = 0; ratio <= 1; ratio += 1.0f / vertexCount)
        {
            if (lineRen.useWorldSpace)
            {

                Vector3 tangentLineVertex1 = Vector3.Lerp(StartNode.position, MidNode1.position, ratio);
                Vector3 tangentLineVectex2 = Vector3.Lerp(MidNode1.position, MidNode2.position, ratio);
                Vector3 tangentLineVectex3 = Vector3.Lerp(MidNode2.position, EndNode.position, ratio);
                Vector3 bezierPoint1 = Vector3.Lerp(tangentLineVertex1, tangentLineVectex2, ratio);
                Vector3 bezierPoint2 = Vector3.Lerp(tangentLineVectex2, tangentLineVectex3, ratio);
                Vector3 bezierPoint = Vector3.Lerp(bezierPoint1, bezierPoint2, ratio);
                pointList.Add(bezierPoint);

            }
            else
            {
               Vector3 tangentLineVertex1 = Vector3.Lerp(StartNode.localPosition, MidNode1.localPosition, ratio);
                Vector3 tangentLineVectex2 = Vector3.Lerp(MidNode1.localPosition, MidNode2.localPosition, ratio);
                Vector3 tangentLineVectex3 = Vector3.Lerp(MidNode2.localPosition, EndNode.localPosition, ratio);
                Vector3 bezierPoint1 = Vector3.Lerp(tangentLineVertex1, tangentLineVectex2, ratio);
                Vector3 bezierPoint2 = Vector3.Lerp(tangentLineVectex2, tangentLineVectex3, ratio);
                Vector3 bezierPoint = Vector3.Lerp(bezierPoint1, bezierPoint2, ratio);
                pointList.Add(bezierPoint);

            }

        }
        if (lineRen.useWorldSpace)
        {
            pointList.Add(EndNode.position);
        }
        else
        {
            pointList.Add(EndNode.localPosition);
        }

        lineRen.positionCount = pointList.Count;
        lineRen.SetPositions(pointList.ToArray());
       // Draw(StartNode.position,EndNode.position,GetComponent<MeshRenderer>(),0.015).transform.SetParent(this.transform);

    }


}

接下来,把LineFourRender.cs拖拽上去:

注意:VertexCount参数决定了绳子的丝滑程度,该值越大,绳子越丝滑。

最后是对LineRenderer组件和绳子材质的调整:

附一张绳子贴图:

相关推荐
不伤欣20 小时前
游戏设计模式 - 子类沙箱
游戏·unity·设计模式
Magnum Lehar1 天前
vulkan游戏引擎test文件memory实现
游戏引擎
Magnum Lehar1 天前
vulkan游戏引擎test_manager实现
java·算法·游戏引擎
快乐觉主吖1 天前
Unity的日志管理类
android·unity·游戏引擎
WarPigs1 天前
Unity性能优化笔记
笔记·unity·游戏引擎
T.D.C2 天前
【业务框架】3C-相机-Cinemachine
unity
一线灵2 天前
跨平台游戏引擎 Axmol-2.6.1 发布
游戏引擎
Clank的游戏栈2 天前
Unity基于GraphView的可视化关卡编辑器开发指南
unity·编辑器·游戏引擎
海尔辛2 天前
Unity UI 性能优化--Sprite 篇
ui·unity·性能优化
三巧3 天前
Godot 敌人生成半径和围墙不匹配,导致敌人错误的生成在围墙外的解决代码
游戏引擎·godot