IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity使用LineRenderer组件画出菱形长度,角度可任意调节 -> 正文阅读

[游戏开发]Unity使用LineRenderer组件画出菱形长度,角度可任意调节

首先说下我的思路:

开始想的比较简单,就是先建两个空物体分别挂上脚本,一个在X轴画直线,一个与X轴成angle夹角,通过计算得出坐标,这样就能画出一个菱形的角度,下面是实例图:

?

最后再写个脚本通过循环遍历,将那两个物体横向,竖向克隆,最后一个完整的菱形就出来了。

上面我用红色标号1表示的是这条边小菱形的数量count,2表示小菱形的边长len,count*len表示的就是整个菱形的边长

实现代码如下:

Draw1

    LineRenderer line;
    ControlDrawL control;
    float len;
    float angle;
    // Start is called before the first frame update
    void Start()
    {
        control = GameObject.Find("Draw").GetComponent<ControlDrawL>();
        angle = control.angle;
        len = control.count * control.len;
        line = gameObject.AddComponent<LineRenderer>();
        line.material = new Material(Shader.Find("Standard"));
        line.startColor = Color.yellow;
        line.endColor = Color.red;
        line.startWidth = 0.5f;
        line.endWidth = 0.5f;

        line.positionCount = 2;
        line.SetPosition(0, new Vector3(transform.position.x, 0, transform.position.z));
        line.SetPosition(1, FindPos(transform.position, angle, len));
    }

    Vector3 FindPos(Vector3 pos, float angle, float len)
    {
        float x = Mathf.Cos(Mathf.Deg2Rad * angle) * len;//Mathf.Deg2Rad*angle:角度转弧度,Mathf.cos是通过弧度计算的
        float z = Mathf.Sin(Mathf.Deg2Rad * angle) * len;
        return new Vector3(pos.x+x, 0, pos.z+z);
    }

这个脚本画的是斜边,所以我写了个FindPos方法来确定LineRenderer要经过的点,传入的参数分别是当前的位置,倾斜角度,大菱形的边长

Draw2

    LineRenderer line;
    float width;
    // Start is called before the first frame update
    void Start()
    {
        ControlDrawL control = GameObject.Find("Draw").GetComponent<ControlDrawL>();
        width = control.count * control.len;
        line = gameObject.AddComponent<LineRenderer>();
        line.material = new Material(Shader.Find("Standard"));
        line.startColor = Color.yellow;
        line.endColor = Color.red;
        line.startWidth = 0.5f;
        line.endWidth = 0.5f;

        line.positionCount = 2;
        line.SetPosition(0, new Vector3(transform.position.x, 0, transform.position.z));
        line.SetPosition(1, new Vector3(transform.position.x+width, 0, transform.position.z));
    }

最后是克隆这两个物体的脚本ControlDraw

    public float angle;
    public float len;
    public int count;
    // Start is called before the first frame update
    void Start()
    {
        for (int i = 1; i <= count; i++)
        {
            GameObject draw1 = Instantiate(GameObject.Find("Draw1"));
            GameObject draw2 = Instantiate(GameObject.Find("Draw2"));
            draw1.transform.position = new Vector3(draw1.transform.position.x + len * i, 0, draw1.transform.position.z);
            draw2.transform.position = FindPos(draw2.transform.position, angle, len*i);
        }
    }

    Vector3 FindPos(Vector3 pos,float angle,float len)
    {
        float x = Mathf.Cos(Mathf.Deg2Rad * angle) * len;//Mathf.Deg2Rad*angle:角度转弧度,Mathf.cos是通过弧度计算的
        float z = Mathf.Sin(Mathf.Deg2Rad * angle) * len;
        return new Vector3(pos.x + x, 0, pos.z + z);
    }

在这个脚本上通过调整angle,len,count最终画出菱形

?

然而问题来了,如果count数量少还好说,克隆出来的物体也不多,性能消耗不大,但数量一多就不是那么美好了,所以我又研究了一种只用一个LineRenderer就能画出整个菱形的方法,下面先看看我是怎么画菱形的

画的虽然有点丑,但具体思路应该是表达清楚了,通过这样的画法能够一笔画出完整的菱形,这里要注意的点是LineRenderer所要确定的端点数量,这个数量是有规律的,通过归纳法确定端点数量为 4*(count+1)-1,count为大菱形边上小菱形的数量

然后将整个流程分成两个步骤,一个实现1功能,另一个实现2功能,最后渲染出来的效果就是一个完整的菱形,具体代码如下:

    public float angle;
    public float len;
    public int count;
    LineRenderer line;
    // Start is called before the first frame update
    void Start()
    {
        line = gameObject.AddComponent<LineRenderer>();
        line.material = new Material(Shader.Find("Standard"));
        line.startColor = Color.yellow;
        line.endColor = Color.red;
        line.startWidth = 0.5f;
        line.endWidth = 0.5f;

        line.positionCount = 4 * (count + 1) - 1;
        DrawRectangular1();
        DrawRectangular2();
    }

    // Update is called once per frame
    void Update()
    {
    }
    Vector3 FindPos(Vector3 pos, float angle, float len)
    {
        float x = Mathf.Cos(Mathf.Deg2Rad * angle) * len;//Mathf.Deg2Rad*angle:角度转弧度,Mathf.cos是通过弧度计算的
        float z = Mathf.Sin(Mathf.Deg2Rad * angle) * len;
        return new Vector3(pos.x + x, 0, pos.z + z);
    }
    void DrawRectangular1()
    {
        int j = 0;
        for (int i = 0; i < 2*(count+1); i++, j += 2)
        {
            line.SetPosition(i, new Vector3(j * len, 0, 0));
            line.SetPosition(i += 1, FindPos(new Vector3(j * len, 0, 0), angle, len*count));
            line.SetPosition(i += 1, FindPos(new Vector3((j + 1) * len, 0, 0), angle, len*count));
            line.SetPosition(i += 1, new Vector3((j + 1) * len, 0, 0));
        }
    }
    void DrawRectangular2()
    {
        float width = len * count;
        Vector3 v1 = new Vector3(width, 0, 0);
        Vector3 v2 = new Vector3(0, 0, 0);
        int j = 0;
        for (int i = 2 * (count + 1)-1; i < line.positionCount; i++, j += 2)
        {
            line.SetPosition(i, v1);
            line.SetPosition(i += 1, v2);
            line.SetPosition(i += 1, FindPos(v2, angle, len));
            line.SetPosition(i += 1, FindPos(v1, angle, len));
            v1 = FindPos(FindPos(v1, angle, len), angle, len);
            v2 = FindPos(FindPos(v2, angle, len), angle, len);
        }
    }

DrawRectangular1实现1功能,DrawRectangular2实现2功能,通过调用这两个方法,画出的菱形就是用一个LineRenderer画出来的了

具体资源已打包,如有需要可自行下载:

DrawTextrueWithLineRenderer.unitypackage-Unity3D文档类资源-CSDN下载unity使用LineRenderer组件画出菱形,角度,大小可控制更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/qq_28837471/43447482

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-11-19 17:55:39  更:2021-11-19 17:56:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 23:35:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码