服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - Unity3d 使用Gizmos画一个圆圈

Unity3d 使用Gizmos画一个圆圈

2022-11-12 14:59mfmdaoyou C#

这篇文章主要介绍了Unity3d 使用Gizmos画一个圆圈的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

Gizmos是场景视图里的一个可视化调试工具。

在做项目过程中。我们常常会用到它,比如:绘制一条射线等。

Unity3D 4.2版本号截至。眼下仅仅提供了绘制射线,线段,网格球体,实体球体,网格立方体,实体立方体,图标。GUI纹理,以及摄像机线框。

 

假设须要绘制一个圆环还须要自己写代码

using UnityEngine;
using System;
public class HeGizmosCircle : MonoBehaviour
{
     public Transform m_Transform;
     public float m_Radius = 1; // 圆环的半径
     public float m_Theta = 0.1f; // 值越低圆环越平滑
     public Color m_Color = Color.green; // 线框颜色
     
     void Start()
     {
            if (m_Transform == null)
            {
                   throw new Exception("Transform is NULL.");
            }
     }
     void OnDrawGizmos()
     {
            if (m_Transform == null) return;
            if (m_Theta < 0.0001f) m_Theta = 0.0001f;
            // 设置矩阵
            Matrix4x4 defaultMatrix = Gizmos.matrix;
            Gizmos.matrix = m_Transform.localToWorldMatrix;
            // 设置颜色
            Color defaultColor = Gizmos.color;
            Gizmos.color = m_Color;
            // 绘制圆环
            Vector3 beginPoint = Vector3.zero;
            Vector3 firstPoint = Vector3.zero;
            for (float theta = 0; theta < 2 * Mathf.PI; theta += m_Theta)
            {
                   float x = m_Radius * Mathf.Cos(theta);
                   float z = m_Radius * Mathf.Sin(theta);
                   Vector3 endPoint = new Vector3(x, 0, z);
                   if (theta == 0)
                   {
                          firstPoint = endPoint;
                   }
                   else
                   {
                          Gizmos.DrawLine(beginPoint, endPoint);
                   }
                   beginPoint = endPoint;
            }
            // 绘制最后一条线段
            Gizmos.DrawLine(firstPoint, beginPoint);
            // 恢复默认颜色
            Gizmos.color = defaultColor;
            // 恢复默认矩阵
            Gizmos.matrix = defaultMatrix;
     }
}

把代码拖到一个GameObject上,关联该GameObject的Transform,然后就能够在Scene视图窗体里显示一个圆了。

Unity3d 使用Gizmos画一个圆圈

Unity3d 使用Gizmos画一个圆圈

通过调整Transform的Position。Rotation。Scale,来调整圆的位置,旋转,缩放。

补充:基于Unity3D使用LineRender组件绘制圆线

在此记录一下使用Unity3D 的LineRender绘制线的过程,经过测试LineRender与OpenGL的GL_LINE_STRIP绘制方式一样,因此计算完点之后需要把起始点即为终点,多算一个点才算闭合。

代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; 
public class DrawLines: MonoBehaviour
{
  public float m_radius = 1.0f;
  public Material m_material;
  public float m_lineWidth = 1.0f;
  private List<Vector3> vPath = new List<Vector3>();
  // Start is called before the first frame update
  void Start()
  {
      int count = 60;
     for (int i=1; i<= (count+1); i++)
      {
          if(i == (count+1))
          {
              float x = Mathf.Cos(2 * Mathf.PI / count) * m_radius;
              float y = transform.localPosition.y;
              float z = Mathf.Sin(2 * Mathf.PI / count) * m_radius;
              vPath.Add(new Vector3(x, y, z));
          }
          else
          {
              float x = Mathf.Cos(2 * Mathf.PI / count * i) * m_radius;
              float y = transform.localPosition.y;
              float z = Mathf.Sin(2 * Mathf.PI / count * i) * m_radius;
              vPath.Add(new Vector3(x, y, z));
          } 
      } 
      GameObject lineGroup = new GameObject("LineGroup");
      GameObject lineObject = new GameObject("RadarLine");
      LineRenderer line = lineObject.AddComponent<LineRenderer>();
      line.material = m_material;
      line.useWorldSpace = false;
      line.positionCount = vPath.Count;
      line.startWidth = m_lineWidth;
      line.endWidth = m_lineWidth;
      line.SetPositions(vPath.ToArray()); 
  } 
  // Update is called once per frame
  void Update()
  {        
  }
}

运行一下看一下效果:

Unity3d 使用Gizmos画一个圆圈

以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。如有错误或未考虑完全的地方,望不吝赐教。

原文链接:https://www.cnblogs.com/mfmdaoyou/p/7235990.html

延伸 · 阅读

精彩推荐
  • C#c# 接口使用实例

    c# 接口使用实例

    这篇文章主要介绍了c#接口使用的实例,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下...

    莫得感情的代码机器9562022-09-27
  • C#Unity实现手机摇一摇震动

    Unity实现手机摇一摇震动

    这篇文章主要为大家详细介绍了untiy实现手机摇一摇震动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    liang_7049597218632022-08-09
  • C#C#调用Java方法实例详解

    C#调用Java方法实例详解

    这篇文章主要介绍了C#调用Java方法实例详解的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下...

    歌神的卖11702021-12-01
  • C#c# record的使用场景

    c# record的使用场景

    这篇文章主要介绍了c# record的使用场景,帮助大家更好的理解和学习使用c#的新特性,感兴趣的朋友可以了解下...

    WeihanLi6992022-10-31
  • C#C#接口归纳总结实例详解

    C#接口归纳总结实例详解

    本篇文章通过实例代码对接口做了详解,需要的朋友可以参考下...

    wbb12162021-12-31
  • C#C#导出pdf的实现方法(浏览器不预览直接下载)

    C#导出pdf的实现方法(浏览器不预览直接下载)

    这篇文章主要给大家介绍了关于C#导出pdf的实现方法,实现后浏览器不预览就可以直接下载,文中通过示例代码介绍的非常详细,对大家学习或者使用C#具有...

    好名字可以让你的朋友更6732022-08-15
  • C#C#设计模式之Builder生成器模式解决带老婆配置电脑问题实例

    C#设计模式之Builder生成器模式解决带老婆配置电脑问题实例

    这篇文章主要介绍了C#设计模式之Builder生成器模式解决带老婆配置电脑问题,简单介绍了生成器模式的概念、功能并结合具体实例形式分析了C#生成器模式解...

    GhostRider6092022-01-21
  • C#C#创建、部署、调用WebService图文实例详解

    C#创建、部署、调用WebService图文实例详解

    本文主要用详细的图文给大家介绍C#创建、部署、调用WebService的全部过程以及中间需要避免的问题。...

    laozhang5862022-02-12