• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Unity5 C# Usuwanie bloków

0 głosów
80 wizyt
pytanie zadane 7 lipca 2017 w C# przez Miki Bywalec (2,450 p.)

Znalazłem na sieci poniższy kod, który chciałem użyć do budowy mapy z bloków. Problem zaczyna się gdy chcę usunąć jeden z bloków. Używając Destroy niszczę wszystko, z tego co widzę to cała "konstrukcja" jest jako jeden obiekt. Da się przerobić ten kod aby zrobić usuwanie pojedynczych bloków (mam tu na myśli dopisanie jednej, dwóch linijek), czy iść w kierunku czegoś innego tj. klonowania obiektów?

 

buildBlockMesh

using UnityEngine;
using System.Collections;
using System;

public class buildBlockMesh : MonoBehaviour {

	public GameObject[] blocks;
    GameObject newBlock;

    void Start()
    {
        newBlock = blocks[0];
    }

    public void SetBlock(int num)
    {
        newBlock = blocks[num];
    }

    void Combine(GameObject block)
    {
        MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>();
        CombineInstance[] combine = new CombineInstance[meshFilters.Length];
        Destroy(this.gameObject.GetComponent<MeshCollider>());

        Vector2[] oldMeshUVs = transform.GetComponent<MeshFilter>().mesh.uv;

        int i = 0;

        while (i < meshFilters.Length) {
            combine[i].mesh = meshFilters[i].sharedMesh;
            combine[i].transform = meshFilters[i].transform.localToWorldMatrix;
            meshFilters[i].gameObject.SetActive(false);
            i++;
        }
        transform.GetComponent<MeshFilter>().mesh = new Mesh();
        transform.GetComponent<MeshFilter>().mesh.CombineMeshes(combine,true);

        //make new UV array
        Vector2[] newMeshUVs = new Vector2[oldMeshUVs.Length+24];
         
        //copy over all UVs
        for(i = 0; i < oldMeshUVs.Length; i++)
            newMeshUVs[i] = oldMeshUVs[i];

        //add new UVs based on individual block settings
        SetUVs suv = block.GetComponent<SetUVs>();
        float tilePerc = 1/suv.pixelSize;
        float umin = tilePerc * suv.tileX;
        float umax = tilePerc * (suv.tileX+1);
        float vmin = tilePerc * suv.tileY;
        float vmax = tilePerc * (suv.tileY+1);
        
        newMeshUVs[newMeshUVs.Length-24] = new Vector2(umin, vmin); 
        newMeshUVs[newMeshUVs.Length-23] = new Vector2(umax, vmin); 
        newMeshUVs[newMeshUVs.Length-22] = new Vector2(umin, vmax); 
        newMeshUVs[newMeshUVs.Length-21] = new Vector2(umax, vmax); 
        newMeshUVs[newMeshUVs.Length-20] = new Vector2(umin, vmax); 
        newMeshUVs[newMeshUVs.Length-19] = new Vector2(umax, vmax); 
        newMeshUVs[newMeshUVs.Length-18] = new Vector2(umin, vmax); 
        newMeshUVs[newMeshUVs.Length-17] = new Vector2(umax, vmax); 
        newMeshUVs[newMeshUVs.Length-16] = new Vector2(umin, vmin); 
        newMeshUVs[newMeshUVs.Length-15] = new Vector2(umax, vmin); 
        newMeshUVs[newMeshUVs.Length-14] = new Vector2(umin, vmin); 
        newMeshUVs[newMeshUVs.Length-13] = new Vector2(umax, vmin); 
        newMeshUVs[newMeshUVs.Length-12] = new Vector2(umin, vmin); 
        newMeshUVs[newMeshUVs.Length-11] = new Vector2(umin, vmax); 
        newMeshUVs[newMeshUVs.Length-10] = new Vector2(umax, vmax); 
        newMeshUVs[newMeshUVs.Length-9] = new Vector2(umax, vmin); 
        newMeshUVs[newMeshUVs.Length-8] = new Vector2(umin, vmin); 
        newMeshUVs[newMeshUVs.Length-7] = new Vector2(umin, vmax); 
        newMeshUVs[newMeshUVs.Length-6] = new Vector2(umax, vmax); 
        newMeshUVs[newMeshUVs.Length-5] = new Vector2(umax, vmin); 
        newMeshUVs[newMeshUVs.Length-4] = new Vector2(umin, vmin); 
        newMeshUVs[newMeshUVs.Length-3] = new Vector2(umin, vmax); 
        newMeshUVs[newMeshUVs.Length-2] = new Vector2(umax, vmax); 
        newMeshUVs[newMeshUVs.Length-1] = new Vector2(umax, vmin);

        transform.GetComponent<MeshFilter>().mesh.uv = newMeshUVs;

        transform.GetComponent<MeshFilter>().mesh.RecalculateBounds();
        transform.GetComponent<MeshFilter>().mesh.RecalculateNormals();
        transform.GetComponent<MeshFilter>().mesh.Optimize();

        this.gameObject.AddComponent<MeshCollider>();
        transform.gameObject.SetActive(true);

        Destroy(block);
    }

    
	// Update is called once per frame
	void Update () 
	{
		if(Input.GetMouseButtonDown(0))
		{
			RaycastHit hit;
			Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
			if(Physics.Raycast(ray, out hit, 1000.0f))
			{
                //generate new block
                Vector3 blockPos = hit.point + hit.normal/2.0f;

                blockPos.x = (float) Math.Round(blockPos.x,MidpointRounding.AwayFromZero);
                blockPos.y = (float) Math.Round(blockPos.y,MidpointRounding.AwayFromZero);
                blockPos.z = (float) Math.Round(blockPos.z,MidpointRounding.AwayFromZero);
                       
                GameObject block = (GameObject) Instantiate(newBlock, blockPos, Quaternion.identity);
                block.transform.parent = this.transform;
                Combine(block);

			}
		}

	}
}

SetUVs

using UnityEngine;
using System.Collections;

public class SetUVs : MonoBehaviour {

	public float pixelSize = 16;
	public float tileX = 1;
	public float tileY = 1;

	// Use this for initialization
	void Start () 
	{

		float tilePerc = 1/pixelSize;

		float umin = tilePerc * tileX;
		float umax = tilePerc * (tileX+1);
		float vmin = tilePerc * tileY;
		float vmax = tilePerc * (tileY+1);
		
		Vector2[] blockUVs = new Vector2[24];

		blockUVs[0] = new Vector2(umin, vmin); 
		blockUVs[1] = new Vector2(umax, vmin); 
		blockUVs[2] = new Vector2(umin, vmax); 
		blockUVs[3] = new Vector2(umax, vmax); 
		blockUVs[4] = new Vector2(umin, vmax); 
		blockUVs[5] = new Vector2(umax, vmax); 
		blockUVs[6] = new Vector2(umin, vmax); 
		blockUVs[7] = new Vector2(umax, vmax); 
		blockUVs[8] = new Vector2(umin, vmin); 
		blockUVs[9] = new Vector2(umax, vmin); 
		blockUVs[10] = new Vector2(umin, vmin); 
		blockUVs[11] = new Vector2(umax, vmin); 
		blockUVs[12] = new Vector2(umin, vmin); 
		blockUVs[13] = new Vector2(umin, vmax); 
		blockUVs[14] = new Vector2(umax, vmax); 
		blockUVs[15] = new Vector2(umax, vmin); 
		blockUVs[16] = new Vector2(umin, vmin); 
		blockUVs[17] = new Vector2(umin, vmax); 
		blockUVs[18] = new Vector2(umax, vmax); 
		blockUVs[19] = new Vector2(umax, vmin); 
		blockUVs[20] = new Vector2(umin, vmin); 
		blockUVs[21] = new Vector2(umin, vmax); 
		blockUVs[22] = new Vector2(umax, vmax); 
		blockUVs[23] = new Vector2(umax, vmin);

		this.GetComponent<MeshFilter>().mesh.uv = blockUVs;
	}
	
	// Update is called once per frame
	void Update () {
	
	}
}

 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
0 odpowiedzi 38 wizyt
pytanie zadane 19 września 2020 w Inne języki przez Robot 12 Początkujący (340 p.)
0 głosów
1 odpowiedź 171 wizyt
pytanie zadane 26 września 2015 w C# przez jegor377 Stary wyjadacz (13,230 p.)
0 głosów
2 odpowiedzi 604 wizyt
pytanie zadane 11 marca 2017 w C# przez mo290103 Obywatel (1,840 p.)

86,460 zapytań

135,216 odpowiedzi

300,377 komentarzy

57,209 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...