在多边形对撞机2D边界上随机实例化预制件

时间:2020-04-14 16:21:19

标签: unity3d

我正在尝试随机实例化山精灵上的树木。 我所做的是向山精灵添加一个多边形对撞机2D组件,这会生成一个边界。 我正在编写一个脚本,以随机实例化山顶边缘上的树(预制件)。

我的问题是,如何从多边形对撞机的上边界获取坐标(位置)?

例如,如果此山多边形对撞机的size.x为100。 在x轴上每10个距离中,我想从其边缘(绑定)选取y偏移,然后将树放置到该位置。所以树的底部总是在山顶的边缘

因此,我实际上是在寻找一种方法来通过其相关的x轴位置来查找y轴位置的边界,例如总大小。对撞机的x是100,而在x axix为50时,如何找到它y轴的上边缘?

2 个答案:

答案 0 :(得分:0)

使用 PolygonCollider2D.points 获取多边形点并将其存储到Vector 2的数组中。

然后根据需要在这些点上实例化树。就像您在每10个点所说的那样,请确保像vec2 [i]那样,每10个点取一个数组值,其中i分别是10、20、30,...。关键部分是在适当的变换位置进行实例化。实例化树时,它将占据树的中心。您可以将树的枢轴点更改为底部,也可以使用计算偏移点来使用它。

答案 1 :(得分:0)

我已经在Unity表单上发布了相同的问题,并得到了以下答案,我相信解决方案正是我所寻找的,因此我将在此处回答自己的问题,您可以click here获得原始内容在Unity论坛中发帖。

解决方案: 从我的物体上方向下进行光线投射可能是最简单的方法,因为如果我从PolygonCollider进行更改并且所有数学运算都为我完成,则可以避免麻烦。

基本上的想法是,得到对撞机,从边界处找到它的最大y值,再向上走一点,直接向下光线投射。

 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;
     }
 }