Как я могу найти положение нижней части объекта в локальном пространстве? - PullRequest
0 голосов
/ 17 декабря 2018

Я хочу нарисовать что-то вроде круга в нижней части объекта.Для этого мне нужно самое низкое положение y объекта в локальном пространстве.

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

[RequireComponent(typeof(UnityEngine.LineRenderer))]
public class DrawCircle : MonoBehaviour
{
    [Range(0, 50)]
    public int segments = 50;
    [Range(1, 50)]
    public float xradius = 5;
    [Range(1, 50)]
    public float yradius = 5;
    [Range(-10, 10)]
    public float height = 0;
    public bool changeBothRadius = false;
    [Range(0.1f, 2)]
    public float lineThickness = 0.1f;
    public bool drawBottom = false;
    public bool minimumRadius = false;
    public bool draw = false;

    private LineRenderer line;

    void Start()
    {
        line = gameObject.GetComponent<UnityEngine.LineRenderer>();
        line.positionCount = segments + 1;
        line.useWorldSpace = false;
    }

    void Update()
    {
        line.startWidth = lineThickness;
        line.endWidth = lineThickness;

        if (draw)
        {
            line.enabled = true;
            CreatePoints();
        }
        else
        {
            line.enabled = false;
        }
    }

    void CreatePoints()
    {
        float x;
        float z;

        float angle = 20;

        if(drawBottom)
        {
            // height needs to be the lowest y value on the object in local space
            height = gameObject.GetComponent<Renderer>().bounds.size.y / 2; 
        }

        for (int i = 0; i < (segments + 1); i++)
        {
            x = Mathf.Sin(Mathf.Deg2Rad * angle) * xradius;
            z = Mathf.Cos(Mathf.Deg2Rad * angle) * yradius;

            line.SetPosition(i, new Vector3(x, height, z));

            angle += (360f / segments + 1);
        }
    }
}

1 Ответ

0 голосов
/ 17 декабря 2018

Вы можете использовать renderer.bounds.min.y, чтобы получить наименьшую y позицию границ рендерера.

Однако, поскольку вы используете LineRenderer.useWorldSpace = false, вам необходимо преобразовать renderer.bounds.min в локальное пространство с помощью transform.InverseTransformPoint,Таким образом, вы хотите transform.InverseTransformPoint(renderer.bounds.min).y

Также вы можете кэшировать рендер в Start, потому что GetComponent - дорогостоящая операция.

private Renderer renderer;

void Start() 
{
    line = gameObject.GetComponent<UnityEngine.LineRenderer>();
    line.positionCount = segments + 1;
    line.useWorldSpace = false;
    renderer = gameObject.GetComponent<Renderer>();
}

void Update()
{
    line.startWidth = lineThickness;
    line.endWidth = lineThickness;

    if (draw)
    {
        line.enabled = true;
        CreatePoints();
    }
    else
    {
        line.enabled = false;
    }
}

void CreatePoints()
{
    float x;
    float z;

    float angle = 20;

    if(drawBottom)
    {
        height = transform.InverseTransformPoint(renderer.bounds.min).y; // here
    }

    for (int i = 0; i < (segments + 1); i++)
    {
        x = Mathf.Sin(Mathf.Deg2Rad * angle) * xradius;
        z = Mathf.Cos(Mathf.Deg2Rad * angle) * yradius;

        line.SetPosition(i, new Vector3(x, height, z));

        angle += (360f / segments + 1);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...