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

Unity5 C# Usuwanie bloków

VPS Starter Arubacloud
0 głosów
131 wizyt
pytanie zadane 7 lipca 2017 w C# przez Miki Bywalec (2,480 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 116 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ź 2,028 wizyt
pytanie zadane 16 kwietnia 2023 w C# przez Whyyy Nowicjusz (240 p.)
0 głosów
1 odpowiedź 334 wizyt
pytanie zadane 26 września 2015 w C# przez jegor377 Stary wyjadacz (13,230 p.)

92,454 zapytań

141,262 odpowiedzi

319,089 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...