Cześć
Na początku chciałem podkreślić że dopiero zaczynam naukę programowania. Chcę zadać kilka pytań aby zrozumieć pisanie kodu. Przechodzę do rzeczy.
"Bawię" się obecnie w programie Unity 3D a za język programowania wybrałem sobie c#.
- Napisałem kod który tworzy płaski teren składający się z sześcianów o wymiarach 10 x 10. Każdy z sześcianów składa się sześciu oddzielnych obiektów (ścianek). Celowo nie skorzystałem z jednolitego modelu bryły gdyż chcę aby ścianki stykające się ze sobą stawały się przezroczyste. Każda z ścianek ma swojego collidera celowo lekko zwiększonego(o 0,01) tak aby wchodziła z kontakt z swoim sąsiadem oraz odpowiednia teksture. Mój problem polega na tym że nie wiem jak dostać się do pojedynczego obiektu. Jak wybrać collider z tej konkretnej ścianki i jak wybrać konkretne znikające ścianki. Funkcja OnTiggerEnter() jest źle napisana gdyż sprawia że znikają wszystkie ścianki, nawet te które się nie dotykają (pisałem metodą prób i błędów i już ją tak zostawiłem :D). Spójrzcie na poniższy kod:
Plik nr1:
using UnityEngine;
using System.Collections;
public class Item : MonoBehaviour
{
public Item
(int Ix, int Iy, int Iz,
GameObject IquadItem_Down,
GameObject IquadItem_Up,
GameObject IquadItem_Side_1,
GameObject IquadItem_Side_2,
GameObject IquadItem_Side_3,
GameObject IquadItem_Side_4,
Texture2D IquadItem_middle,
Texture2D IquadItem_up,
Texture2D IquadItem_down)
{
quadItem_Down = IquadItem_Down;
quadItem_Up = IquadItem_Up;
quadItem_Side_1 = IquadItem_Side_1;
quadItem_Side_2 = IquadItem_Side_2;
quadItem_Side_3 = IquadItem_Side_3;
quadItem_Side_4 = IquadItem_Side_4;
quadItem_middle = IquadItem_middle;
quadItem_up = IquadItem_up;
quadItem_down = IquadItem_down;
x = Ix;
y = Iy;
z = Iz;
CreateBlock();
}
int x;
int y;
int z;
public GameObject quadItem_Down;
public GameObject quadItem_Up;
public GameObject quadItem_Side_1;
public GameObject quadItem_Side_2;
public GameObject quadItem_Side_3;
public GameObject quadItem_Side_4;
Texture2D quadItem_middle;
Texture2D quadItem_up;
Texture2D quadItem_down;
void Start()
{
}
void Update ()
{
OnTiggerEnter(quadItem_Down.collider);
}
void CreateBlock()
{
Instantiate(quadItem_Down, new Vector3(x, y - (float)0.5, z), Quaternion.Euler(new Vector3(270, 0, 0)));
Instantiate(quadItem_Up, new Vector3(x, y + (float)0.5, z), Quaternion.Euler(new Vector3(90, 0, 0)));
Instantiate(quadItem_Side_1, new Vector3(x - (float)0.5, y, z), Quaternion.Euler(new Vector3(0, 90, 0)));
Instantiate(quadItem_Side_2, new Vector3(x, y, z - (float)0.5), Quaternion.Euler(new Vector3(0, 0, 0)));
Instantiate(quadItem_Side_3, new Vector3(x + (float)0.5, y, z), Quaternion.Euler(new Vector3(0, 270, 0)));
Instantiate(quadItem_Side_4, new Vector3(x, y, z + (float)0.5), Quaternion.Euler(new Vector3(0, 180, 0)));
}
void OnTiggerEnter(Collider other)
{
if (other.tag == "SIDE1")
{
quadItem_Side_1.renderer.enabled = false;
}
}
}
Plik nr2:
using UnityEngine;
using System.Collections;
public partial class Place : MonoBehaviour
{
public GameObject quadBlock_Down;
public GameObject quadBlock_Up;
public GameObject quadBlock_Side_1;
public GameObject quadBlock_Side_2;
public GameObject quadBlock_Side_3;
public GameObject quadBlock_Side_4;
Texture2D quadBlock_middle;
Texture2D quadBlock_up;
Texture2D quadBlock_down;
void Start ()
{
for (int x = 0; x < 10; x++)
{
for (int z = 0; z < 10; z++)
{
Item plane = new Item(x, 0, z, quadBlock_Down, quadBlock_Up, quadBlock_Side_1, quadBlock_Side_2, quadBlock_Side_3, quadBlock_Side_4, quadBlock_middle, quadBlock_up, quadBlock_down);
}
}
}
void Update ()
{
}
void loadTexture()
{
quadBlock_middle = Resources.Load<Texture2D>("Texture/Block/stoneBlock");
quadBlock_up = Resources.Load<Texture2D>("Texture/Block/stoneBlock");
quadBlock_down = Resources.Load<Texture2D>("Texture/Block/stoneBlock");
}
}
-
Czy macie jakieś dodatkowe wskazówki dotyczące tego kodu?
-
Ostatnie pytanie, możecie wyłożyć łopatą o co chodzi z błędem "object reference not set to an instance of an object"? Chodzi o podanie jakiegoś konkretnego przykładu, dlaczego raz obiekt/referencje działa a drugi raz nie, w czym tkwi błąd :)