Unity游戏-用线条绘制电路

时间:2018-12-17 15:00:54

标签: unity3d line generator mesh renderer

我不是一个团结的初学者,但到目前为止还不是。 今天,我想做一个混池弹球游戏。 对我来说,游戏物理性还可以,但是我面临的最大挑战是: what i want to do

允许玩家绘制自己的电路,然后放置其他物品:保险杠,粘墙...

我以3D制作,但在相机位置,它就像2D。 首先,我不知道如何制作弯曲的游戏对象。我知道贝塞尔曲线生成器,但不知道如何生成形状。

理想情况下,如果可以的话,那会很棒:画一条线(使用鼠标或取景器位置),就像画线渲染器组件一样,然后在一个方向上将场电路统一拉伸。那就是我的巡回赛。 第二个挑战是(用鼠标或手指敲击)放置不同的组件:保险杠,玩家……要遵循一些规则:粘性墙必须位于赛道的简单墙上,而不是在中间,您必须始终为球等留一些空间... 然后我们创建一个游戏电路,然后就可以玩了:):)

我使用上一个统一版本。

很明显,我不希望有完整的解决方案:rolleyes:但是根据您的说法,这可能吗?而我应该学习哪种方法,哪种技术呢?哪个可能是最大的问题? ...任何备注建议都可以接受。

我已经开始研究https://unity3d.com/fr/learn/tutori...ation-tutorial/creating-meshes?playlist=17153,我不知道它是否完全太多了?

非常感谢您的帮助, Axel

1 个答案:

答案 0 :(得分:0)

这是我的解决方法

using System.IO;
using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEngine.Networking;
public class scri : MonoBehaviour
{
// For saving the mesh------------------------ 
public KeyCode saveKey = KeyCode.F12;
public string saveName = "SavedMesh";

// Concerning mesher--------------------------
public GameObject mesher; //require

public List<Vector3> vertices;
public  List<int> triangles;

public Vector3 point0;
public Vector3 point1;
public Vector3 point2;
public Vector3 point3;

public int loop;
public float size;

public Mesh meshFilterMesh;
public Mesh meshColliderMesh;

// Sprite work
public Color[] pixels;

public Texture2D newTexture;  
public Texture2D oldTexture;  //require

private Sprite mySprite;
private SpriteRenderer spriteRenderer;

public int pathCount;

public GameObject displayerComponent; //require

public PolygonCollider2D polygonColliderAdded; //require

void Start()
{
    // Mesher
    vertices = new List<Vector3> (); 
    triangles = new List<int> (); 
    meshFilterMesh= mesher.GetComponent<MeshFilter>().mesh;
    meshColliderMesh= mesher.GetComponent<MeshCollider>().sharedMesh;
    size = 10; // lenght of the mesh in Z direction
    loop=0;

    // Sprite
    pixels = oldTexture.GetPixels();
    newTexture =new Texture2D(oldTexture.width,oldTexture.height,TextureFormat.ARGB32, false);
    spriteRenderer = gameObject.AddComponent<SpriteRenderer>();

    ConvertSpriteAndCreateCollider (pixels);
    BrowseColliderToCreateMesh (polygonColliderAdded);

}

void Update()
{
    // Save if F12 press
    if (Input.GetKeyDown(saveKey)){SaveAsset();}
}

public void ConvertSpriteAndCreateCollider (Color[] pixels) {
    for (int i = 0 ; i < pixels.Length ; i++ ) 
    { 
        // delete all black pixel (black is the circuit, white is the walls)
        if ((pixels[i].r==0 && pixels[i].g==0 && pixels[i].b==0 && pixels[i].a==1)) {
            pixels[i] = Color.clear;
        }
    }
    // Set a new texture with this pixel list
    newTexture.SetPixels(pixels);
    newTexture.Apply();

    // Create a sprite from this texture
    mySprite = Sprite.Create(newTexture, new Rect(0, 0, newTexture.width, newTexture.height), new Vector2(10.0f,10.0f), 10.0f, 0, SpriteMeshType.Tight,new Vector4(0,0,0,0),false);

    // Add it to our displayerComponent
    displayerComponent.GetComponent<SpriteRenderer>().sprite=mySprite;

    // Add the polygon collider to our displayer Component and get his path count
    polygonColliderAdded = displayerComponent.AddComponent<PolygonCollider2D>();

}

// Method to browse the collider and launch makemesh
public void BrowseColliderToCreateMesh (PolygonCollider2D polygonColliderAdded){
    //browse all path from collider
    pathCount=polygonColliderAdded.pathCount;
    for (int i = 0; i < pathCount; i++)
    {
        Vector2[] path = polygonColliderAdded.GetPath(i);

        // browse all path point
        for (int j = 1; j < path.Length; j++)
        {
            if (j != (path.Length - 1)) // if we aren't at the last point
            {
            point0 = new Vector3(path[j-1].x ,path[j-1].y ,0);
            point1 = new Vector3(path[j-1].x ,path[j-1].y ,size);
            point2 = new Vector3(path[j].x ,path[j].y ,size);
            point3 = new Vector3(path[j].x ,path[j].y ,0);
                MakeMesh(point0,point1,point2,point3);

            } 
            else if(j == (path.Length - 1))// if we are at the last point, we need to close the loop with the first point
            {
            point0 = new Vector3(path[j-1].x ,path[j-1].y ,0);
            point1 = new Vector3(path[j-1].x ,path[j-1].y ,size);
            point2 = new Vector3(path[j].x ,path[j].y ,size);
            point3 = new Vector3(path[j].x ,path[j].y ,0);
                MakeMesh(point0,point1,point2,point3);
            point0 = new Vector3(path[j].x ,path[j].y ,0);
            point1 = new Vector3(path[j].x ,path[j].y ,size);
            point2 = new Vector3(path[0].x ,path[0].y ,size); // First point
            point3 = new Vector3(path[0].x ,path[0].y ,0); // First point
                MakeMesh(point0,point1,point2,point3);
            }
        }
    }
}


//Method to generate 2 triangles mesh from the 4 points 0 1 2 3 and add it to the collider
public void MakeMesh (Vector3 point0,Vector3 point1,Vector3 point2, Vector3 point3){

    // Vertice add
    vertices.Add(point0);
    vertices.Add(point1);
    vertices.Add(point2);
    vertices.Add(point3);

    //Triangle order
    triangles.Add(0+loop*4);
    triangles.Add(2+loop*4);
    triangles.Add(1+loop*4);
    triangles.Add(0+loop*4);
    triangles.Add(3+loop*4);
    triangles.Add(2+loop*4);
    loop = loop + 1; 

    // create mesh 
    meshFilterMesh.vertices=vertices.ToArray();
    meshFilterMesh.triangles=triangles.ToArray();

    // add this mesh to the MeshCollider
    mesher.GetComponent<MeshCollider>().sharedMesh=meshFilterMesh;
}

// Save if F12 press
public void SaveAsset() 
{
    var mf = mesher.GetComponent<MeshFilter>();
    if (mf)
    {
        var savePath = "Assets/" + saveName + ".asset";
        Debug.Log("Saved Mesh to:" + savePath);
        AssetDatabase.CreateAsset(mf.mesh, savePath);
    }
}

}

enter image description here