找回密码
 立即注册
查看: 355|回复: 5

10行代码在Unity中实现一条绳子

  [复制链接]
发表于 2022-2-18 10:06 | 显示全部楼层 |阅读模式
0.效果



1.代码

using UnityEngine;

public class Rope : MonoBehaviour
{
    [SerializeField] private Transform[] ropeTransforms;
    [SerializeField] private float ropeLength = 1;

    private float[] x;
    private float[] y;

    private void Start()
    {
        x = new float[ropeTransforms.Length];
        y = new float[ropeTransforms.Length];
    }

    private void Update()
    {
        DragRope(0, Camera.main.ScreenToWorldPoint(Input.mousePosition).x, Camera.main.ScreenToWorldPoint(Input.mousePosition).y);

        for (int i = 0; i < ropeTransforms.Length - 1; i++)
        {
            DragRope(i + 1, x, y);
        }
    }

    private void DragRope(int index, float x, float y)
    {
        //使用反正切,计算出鼠标位置与绳子原点的弧度
        float dx = x - this.x[index];
        float dy = y - this.y[index];
        float rad = Mathf.Atan2(dy, dx);

        //关键的每帧原理:
        //每帧根据此弧度的正弦和余弦偏移出绳子应该出现的位置。
        this.x[index] = x - Mathf.Cos(rad) * ropeLength;
        this.y[index] = y - Mathf.Sin(rad) * ropeLength;

        //将弧度转换为角度,为整条绳子的各个子线段赋值位置与旋转
        float deg = rad * Mathf.Rad2Deg;
        ropeTransforms[index].position = new Vector2(this.x[index], this.y[index]);
        ropeTransforms[index].eulerAngles = new Vector3(0, 0, deg);
    }
}
2.几个要点


  • Atan2:不同于Atan,它会正确处理象限和邻边为0的情况,我们首先用此函数计算出鼠标位置和绳子之间的弧度。
  • Cos与Sin:正弦波与余弦波。每帧根据上边得到的弧度的正弦和余弦偏移出绳子应该出现的位置。这是实现绳子的每帧关键原理,我们从下方的动图可以看到,弧度从0开始,余弦在1/0/-1/0/1周期内运动,正弦在0/1/0/-1/0周期内运动。例如鼠标位置的x在2,那么 2 - (1 * 线段长度) = 1,所以线段的x位置应该来到1,余弦的最大值永远为1。又比如鼠标y位置在2,那么 2 - (1 * 线段长度) = 1,正弦的最大值也为1,所以线段的y位置应该来到1,正弦为1时余弦的值为0,所以x轴没有任何偏移。



  • 上面是首条线段和鼠标位置的计算逻辑,将10条线段形成一个数组,首尾相连,每帧执行相同的逻辑,就成为了一条绳子。
  • 最后,为了与Unity同步,将弧度转换为角度,赋值给Transform相关属性。
3.源码与Demo

为了让感兴趣的同学更加方便,在此提供源码与Demo,将文件导入Unity即可运行。

本帖子中包含更多资源

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

×

评分

参与人数 1鲜花 +2 收起 理由
lvfulin555 + 2 很给力!

查看全部评分

发表于 2022-2-18 10:16 | 显示全部楼层
十呢?
发表于 2022-2-18 10:26 | 显示全部楼层
好耶
发表于 2022-2-18 10:31 | 显示全部楼层
[赞同]
发表于 2022-6-8 10:18 | 显示全部楼层
哪里下载源码
发表于 2022-6-8 10:21 | 显示全部楼层
题主,没有demo可以下载啊
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-22 09:54 , Processed in 0.093536 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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