我如何创建一个随机的星球生成器,并在Unity上使用它?

例如: https : //managore.itch.io/planetarium

像这样的东西,创建至less是现实的,看起来像现实主义的随机精灵圆,只要现实可以是像素,我不认为这可以在Unity上完成,所以我想我可能需要实现它后,我编码在另一个语言或其他引擎,所以我如何做到这一点? 我可以做统一吗? 如果我决定团结不适合这个事情,我将如何实施?

行星的使用将贯穿整个游戏,并将被用作主星球,所以它对游戏有很大的价值

简答:如果你想产生随机行星,你应该为实例化的行星产生随机旋转,距离,颜色等。

在这里输入图像说明

你问了关于你的精灵的像素效果。 你可以使用着色器来做到这一点:

着色器是包含math计算和algorithm的小脚本,用于根据光照input和材质configuration计算渲染的每个像素的颜色。 https://docs.unity3d.com/Manual/Shaders.html

你问了语言:

在Unity中,着色器程序是用HLSL语言(也称为Cg)的变体编写的,但对于大多数实际应用来说,两者是相同的。 https://docs.unity3d.com/Manual/SL-ShadingLanguage.html

接下来你提到了3D位置的轨道精灵的问题,所以不要使用精灵,而要将3D对象着色成2D对象(如上图)或使用World Space UI:

创建世界空间UI UI系统可以轻松创建位于场景中其他2D或3D对象之间的世界的UI。 首先创建一个UI元素(比如一个Image),如果在场景中还没有一个使用GameObject> UI> Image。 这也将为您创建一个canvas。 https://docs.unity3d.com/Manual/HOWTO-UIWorldSpace.html

这是发电机和星球脚本,我解释了我的代码中的所有东西(通过评论)

生成器脚本:

using UnityEngine; using System.Collections; public class Generator : MonoBehaviour { public GameObject prefab;//planet prefab public static GameObject Earth;//All object will orbit around this public static float lastTime;//last time void Update () { Earth = GameObject.FindGameObjectWithTag("Earth");//Find Earth if (Input.GetKeyDown(KeyCode.Space))//if press space generate planet { lastTime = Time.time;//when object instantiated store Time.time as last time we use it in planet script Instantiate(prefab, Earth.transform.position, Quaternion.identity); } } } 

行星脚本:

 using UnityEngine; using System.Collections; public class Planet : MonoBehaviour { [Range(0,100)]//Range for speed public float speed = 20;// Rotation Speed public float alpha; //will use for cos & sin (as angle) public float distance;//distance from center public float Rotation;//rotation angle public float currentTime;//Time start when Instantiated void Start () { //Initialize new planet with Random rotation & distance & size //Random Rotation between -2 & 2 Rotation = Random.Range(-2.0f, 2.0f); //Random distance between -1 & 2 distance = Random.Range(1.0f, 2.0f); //Random Size between 0.2f & 0.7f var Size = Random.Range(0.2f, 0.7f); //Set localScale with random size transform.localScale = new Vector3(Size, Size, Size); //calculating current time by subtraction Time.time and lastTime currentTime = Time.time - Generator.lastTime; //GetComponent<MeshRenderer>().material.color = new Color(Random.value, Random.value, Random.value); //Random Color } void Update () { //Timer currentTime += Time.deltaTime; var X = (distance * Mathf.Cos(currentTime));//X var Y = (distance * Mathf.Sin(currentTime));//Y var R = (Rotation * Mathf.Cos(currentTime));//Rotation //give earth from generator class var Earth = Generator.Earth; transform.position = Earth.transform.position + new Vector3(X, R, Y);// RotateAround Earth //Basic Orbit: //this is simple way that you can orbitting objects around other object //transform.Rotate(transform.up * speed * Time.deltaTime); //transform.RotateAround(Earth.transform.position, Vector3.up, speed * Time.deltaTime); } } 

我把这个项目放在我的github中: https : //github.com/smkplus/orbit/archive/master.zip