Многострочные рендеры, каждый из которых следует за другим объектом - PullRequest
0 голосов
/ 14 февраля 2019

Я хотел бы помочь с моим кодом.Моя цель состоит в том, чтобы разные рендеры линий (макс. 4) следовали за игроками, которые входят в определенную область, определенную сферой перекрытия.Я хотел бы, чтобы линии появлялись только тогда, когда игроки входили в зону и уходили, когда игроки уходили.Я пробовал 4 разных подхода, но не получил, пожалуйста, помогите.Спасибо

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

public class Transmission : MonoBehaviour
{
    private LineRenderer lr;
    private LineRenderer lr2;
    private LineRenderer lr3;
    private LineRenderer lr4;

    public Rigidbody rb;
    public float fieldofview = 20;
    Collider[] UsersInsideZone;
    public List<LineRenderer> lines;
    private Transform goTransform;
    private Ray ray;
    RaycastHit hit;
    int current;
    int count;
    public int Numberof5Gusers;

    // Use this for initialization
    void Start()
    {
        lr = gameObject.AddComponent<LineRenderer>();
        lr2 = gameObject.AddComponent<LineRenderer>();
        lr3 = gameObject.AddComponent<LineRenderer>();
        lr4 = gameObject.AddComponent<LineRenderer>();

        lines = new List<LineRenderer>();
    }

    // Update is called once per frame
    void Update()
    {
        //Creating A zone where the 5G connection works in
        int playerMask = LayerMask.NameToLayer("player");
        int layer = (1 << playerMask);
        UsersInsideZone = Physics.OverlapSphere(rb.transform.position, fieldofview, layer);

        int amountofplayers = UsersInsideZone.Length;

        //for(int i = 0; i > UsersInsideZone.Length; i++)
        // {
        //    vertices[i] = UsersInsideZone[i].gameObject.transform.position;
        //     Instantiate(lr);
        //     lr.SetPosition(0, rb.transform.position);
        //      lr.SetPosition(1, UsersInsideZone[i].gameObject.transform.position);
        //  }

        // drawing a ray for each user in the zone 

        foreach (Collider player in UsersInsideZone)
        {
            // ALOT OF BEAMS THAT ARE PINK

            //if (!player.GetComponent<LineRenderer>())
            /// {
            //   player.gameObject.AddComponent<LineRenderer>();
            //Destroy(player.GetComponent<LineRenderer>());

            // DrawBeam(player.transform.position, this.transform.position, Numberof5Gusers);

            // if (player.transform.position.magnitude - rb.transform.position.magnitude > fieldofview)
            // {
            //    Debug.Log("fdsafsa0");

            //  Destroy(player.GetComponent<LineRenderer>());
            // }
            //  }

            //One beam that doesnt follow more than one object
            for (int j = 0; j < UsersInsideZone.Length; j++)
            {
                lr.SetPosition(0, rb.transform.position);
                lr.SetPosition(1, UsersInsideZone[j].gameObject.transform.position);
            }

            // test white lines 
            Debug.DrawRay(rb.transform.position, player.transform.position, Color.green);
        }
    }

    void DrawBeam(Vector3 position, Vector3 start, int count)
    {
        LineRenderer lrend = new GameObject().AddComponent<LineRenderer>() as LineRenderer;
        lrend.SetPosition(0, start);
        lrend.SetPosition(1, position);
    }

    //RAYCASTING APPROACH 
    //   Vector3 target = player.transform.position;

    // RaycastHit hit1;
    // Vector3 end = rb.transform.position + (25 * player.transform.position);
    // if (!player.GetComponent<LineRenderer>())
    // {

    // lr.SetPosition(0, rb.transform.position);
    //   Ray ray = new Ray(rb.transform.position, player.transform.position);

    //  if (Physics.Raycast(ray, out hit1, layer))
    //  {
    //    if (hit1.collider)
    //    {

    //       lr.SetPosition(1, hit1.point);
    //    }
    //    if(hit1.collider.transform.position.magnitude> fieldofview)
    //    {
    //         Destroy(lr);
    //         lr.SetPosition(1, rb.transform.position);
    //    }
    //}
}

1 Ответ

0 голосов
/ 15 февраля 2019

Прежде всего, вы не можете иметь несколько Renderers, прикрепленных к одному и тому же GameObject.

Так что я бы предпочел просто создать 4 пустых дочерних объекта с прикрепленными к ним компонентами, такими как

void Start()
{
    lr = new GameObject().AddComponent<LineRenderer>();
    lr.gameObject.SetParent(transform, false);
    // just to be sure reset position and rotation as well
    lr.gameObject.transform.SetPositionAndRotation(Vector3.zero, Quaternion.identity);

    lr2 = new GameObject().AddComponent<LineRenderer>();
    lr2.gameObject.SetParent(transform, false);
    // just to be sure reset position and rotation as well
    lr2.gameObject.transform.SetPositionAndRotation(Vector3.zero, Quaternion.identity);

    lr3 = new GameObject().AddComponent<LineRenderer>();
    lr3.gameObject.SetParent(transform, false);
    // just to be sure reset position and rotation as well
    lr3.gameObject.transform.SetPositionAndRotation(Vector3.zero, Quaternion.identity);

    lr4 = new GameObject().AddComponent<LineRenderer>();
    lr4.gameObject.SetParent(transform, false);
    // just to be sure reset position and rotation as well
    lr4.gameObject.transform.SetPositionAndRotation(Vector3.zero, Quaternion.identity);
}

Проще было бы, если бы вы создали один префаб из пустого GameObjet с LinerRenderer и сделали, например,

LineRenderer linePrefab;

void Start()
{
    lr = Instantiate(linePrefab, transform);
    lr2 = Instantiate(linePrefab, transform);
    lr3 = Instantiate(linePrefab, transform);
    lr4 = Instantiate(linePrefab, transform);

    //...
}

или ... почему бы не создать эту структуру в редакторе?Чем бы вам не пришлось делать это по сценарию вообще ...


Вы никогда не заполните свой список lines (на самом деле вам даже не понадобятся отдельные переменные)

lines = new List<LineRenderer>();

lines.Add(lr);
lines.Add(lr2);
lines.Add(lr3);
lines.Add(lr4);

и

// МНОЖЕСТВО ПУЧКОВ, КОТОРЫЕ РОЗОВЫЕ

Вы должны назначить Material для LineRenderer s, например, как

public Material lineMaterial;

void Start()
{
    // ...

    // set material
    foreach(var line in lines)
    {
        line.material = lineMaterial;

        // could also give them colors
        //line.material.color = someColor;
    }
}

Теперь к регистрации Update()

// ...

// run through all available lines
for (int i = 0; i < lines.Count; i++)
{
    var currentLine = lines[i];

    // if under player count -> set enabled and set positions
    if(i < amountofplayers)
    {
        currentLine.enabled = true;

        // set target to player at same index as this line
        currentLine.SetPosition(0, transform.position);
        currentLine.SetPosition(1, UsersInsideZone[i].gameObject.transform.position);
    }

    // otherwise set disabled
    else   
    {
        currentLine.enabled = false;
    }
}

Примечание : я бы все равно не сделал это Physics.OverlapSphere, так как сначала это стоитво-вторых, производительность может не возвращать игроков всегда в том же порядке.

Я бы предпочел сделать что-то вроде

private List<Collider> UsersInsideZone = new List<Collider>();

private void OnTriggerEnter(Collider col)
{
    // you would give them tags instead of a layer
    if(col.gameObject.tag != "player") return;

    // or alternative set which layers can collide at all in the Physics settings

    if(UsersInsideZone.Contains(col)) return;

    UsersInsideZone.Add(col);
}

private void OnTriggerExit(Collider col)
{
    // you would give them tags instead of a layer
    if(col.gameObject.tag != "player") return;

    // or alternative set which layers can collide at all in the Physics settings

    if(!UsersInsideZone.Contains(col)) return;

    UsersInsideZone.Remove(col);
}

private void Update()
{
    // run through all available lines
    for (int i = 0; i < lines.Count; i++)
    {
        var currentLine = lines[i];

        // if under player count -> set enabled and set positions
        if(i < amountofplayers)
        {
            currentLine.enabled = true;

            // set target to player at same index as this line
            currentLine.SetPosition(0, transform.position);
            currentLine.SetPosition(1, UsersInsideZone[i].gameObject.transform.position);
        }

        // otherwise set disabled
        else   
        {
            currentLine.enabled = false;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...