создание префабов случайным образом на 2D границах многоугольника - PullRequest
0 голосов
/ 14 апреля 2020

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

У меня вопрос, как мне получить координаты (позиции) от этой верхней границы многоугольного коллайдера?

Например, если size.x этого горного многоугольника-коллайдера равен 100. На каждых 10 расстояниях по оси x я хотел бы выбрать смещение y от его края (границы), а затем поместить дерево в эту позицию. таким образом, нижняя часть дерева всегда на краю этой вершины горы

Поэтому я на самом деле ищу способ найти отклонение от оси у границ по соответствующему положению оси х, скажем, к общему размеру. коллайдера равно 100, когда на оси x 50, как мне найти его верхний край оси y?

Ответы [ 2 ]

0 голосов
/ 15 апреля 2020

Я разместил тот же вопрос в форме Unity и получил следующий ответ, я думаю, что решения - это именно то, что я искал, поэтому я отвечу на свой вопрос здесь, вы можете нажать здесь , чтобы получить к исходному сообщению на форуме Unity.

Решение: Raycasting сверху моего объекта, вероятно, самый простой, так как он позволяет избежать осложнений, если я перехожу с PolygonCollider и все математические вычисления сделаны для меня.

По сути, идея заключается в том, чтобы получить коллайдер, найти его наибольшее значение y из границ, go чуть больше, raycast прямо вниз.

 using System;
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 
 public class TopPoint2D : MonoBehaviour
 {
 
     private new Collider2D collider;
 
     void Start()
     {
         collider = GetComponent<Collider2D>();
 
         Debug.Log(GetTopPoint(0));
         Debug.Log(GetTopPoint(1));
         Debug.Log(GetTopPoint(5));
         Debug.Log(GetTopPoint(10));
         Debug.Log(GetTopPoint(11));
     }
 
     private Nullable<Vector2> GetTopPoint(float xOffset){
         // a point on the y axis that is always above our collider
         float yStrictlyAbove = collider.bounds.max.y + 0.1f;
         
         float xMin = collider.bounds.min.x;
         
         float yStrictlyBelow = collider.bounds.min.y - 0.1f;
         float distance = yStrictlyAbove - yStrictlyBelow;
 
         RaycastHit2D[] hits = Physics2D.RaycastAll(
             new Vector2(xMin + xOffset, yStrictlyAbove),
             Vector2.down,
             distance: distance
         );
 
         foreach(RaycastHit2D h in hits){
             if(h.collider == collider){
                 return new Nullable<Vector2>(h.point);
             }
         }
 
         return null;
     }
 }
0 голосов
/ 14 апреля 2020

Получите точки многоугольника, используя PolygonCollider2D.points и сохраните их в массиве Vector 2.

Затем создайте свои деревья на этих точках, как вы хотите. Как вы сказали в каждых 10 точках, убедитесь, что вы берете значение массива из каждых 10 точек, как в vec2 [i], где i равны 10, 20, 30, ... Важнейшей частью будет принятие Instantiating в правильной позиции преобразования. Когда вы создаете экземпляр своего дерева, оно займет центр дерева. Вы можете изменить опорную точку дерева внизу или взять точку смещения и использовать ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...