如何在2点之间以半圆形放置球体

时间:2019-06-24 13:51:10

标签: c# unity3d

我在两个给定点之间生成小球体。但是,它总是沿直线产生。球形是否有可能开始生成从点A到点B的曲线?

我正在通过定义NumberOfSegments来定义两点之间应生成多少个球体。

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

public class GeneratePoints : MonoBehaviour
{
    public Transform PointA; 
    public Transform PointB; 
    public float NumberOfSegments = 3; 
    public float AlongThePath = .25f;

    // Update is called once per frame
    void Start()
    {
       StartCoroutine(StartSpheringOut());
    }

    IEnumerator StartSpheringOut()
    {
        NumberOfSegments += 1;// since we are skipping 1st placement since its the same as starting point we increase the number by 1 
        AlongThePath = 1 / (NumberOfSegments);//% along the path

        for (int i = 1; i < NumberOfSegments; i++)
        {
            yield return new WaitForSeconds(0.05f);
            Vector3 CreatPosition = PointA.position + (PointB.position - PointA.position) * (AlongThePath * i);

            GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
            sphere.transform.position = CreatPosition;
            sphere.transform.localScale = new Vector3(0.05f, 0.05f, 0.05f);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

这实际上已经存在于Unity Manual中:

using UnityEngine;
public class CircleFormation : MonoBehaviour
{
   // Instantiates prefabs in a circle formation
   public GameObject prefab;
   public int numberOfObjects = 20;
   public float radius = 5f;

   void Start()
   {
       for (int i = 0; i < numberOfObjects; i++)
       {
           float angle = i * Mathf.PI * 2 / numberOfObjects;
           float x = Mathf.Cos(angle) * radius;
           float z = Mathf.Sin(angle) * radius;
           Vector3 pos = transform.position + new Vector3(x, 0, z);
           float angleDegrees = -angle*Mathf.Rad2Deg;
           Quaternion rot = Quaternion.Euler(0, angleDegrees, 0);
           Instantiate(prefab, pos, rot);
       }
   }
}

您可以将其用于初学者,然后根据需要对其进行调整,以使其能够正常工作。因此,由于您只想要圆环的一半,因此您要做的基本上是将angle除以2并加上pointApointB以便计算出中心位置。另外,如果两个位置都不在同一XZ平面上,则必须旋转整个圆:

public GameObject A;
public GameObject B;

public int amount;

[ContextMenu("PlaceSpheres()")]
privtae void DebugPlace()
{
    PlaceSpheres(A.transform.position, B.transform.position, amount);
}

public void PlaceSpheres(Vector3 posA, Vector3 posB, int numberOfObjects)
{
    // get circle center and radius
    var radius = Vector3.Distance(posA, posB) / 2f;
    var centerPos = (posA + posB) / 2f;

    // get a rotation that looks in the direction
    // posA -> posB
    var centerDirection = Quaternion.LookRotation((posB - posA).normalized);

    for (var i = 0; i < numberOfObjects; i++)
    {
        // Max angle is 180° (= Mathf.PI in rad) not 360° (= Mathf.PI * 2 in rad)
        //          |
        //          |    don't place the first object exactly on posA 
        //          |    but start already with an offset
        //          |    (remove the +1 if you want to start at posA instead)
        //          |               |
        //          |               |     don't place the last object on posB 
        //          |               |     but end one offset before
        //          |               |     (remove the +1 if you want to end 
        //          |               |     exactly a posB instead)
        //          |               |                       |
        //          V               V                       V
        var angle = Mathf.PI * (i + 1) / (numberOfObjects + 1f);
        var x = Mathf.Sin(angle) * radius;
        var z = Mathf.Cos(angle) * radius;
        var pos = new Vector3(x, 0, z);
        // Rotate the pos vector according to the centerDirection
        pos = centerDirection * pos;

        var sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        sphere.transform.position = centerPos + pos;
        sphere.transform.localScale = new Vector3(0.05f, 0.05f, 0.05f);
    }
}

enter image description here