我正在尝试随机实例化山精灵上的树木。 我所做的是向山精灵添加一个多边形对撞机2D组件,这会生成一个边界。 我正在编写一个脚本,以随机实例化山顶边缘上的树(预制件)。
我的问题是,如何从多边形对撞机的上边界获取坐标(位置)?
例如,如果此山多边形对撞机的size.x为100。 在x轴上每10个距离中,我想从其边缘(绑定)选取y偏移,然后将树放置到该位置。所以树的底部总是在山顶的边缘
因此,我实际上是在寻找一种方法来通过其相关的x轴位置来查找y轴位置的边界,例如总大小。对撞机的x是100,而在x axix为50时,如何找到它y轴的上边缘?
答案 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;
}
}