Mam pewien problem, po skopiowaniu cuba i zmianie life tego skopiowanego cuba zmienia mi się kolor obydwóch cubów na ten sam. Natomiast life w oryginalnym cubie jest taki jak był na początku. Po odpaleniu gry wszystko sie zgadza, tylko w edytorze tak to działa.
Wynika to ze współdzielenia materiału w podglądzie sceny. Dla oszczędności miejsca jest to 1 materiał referencyjny, trzeba dostać się z kodu do tego materiału i wyłączyć współdzielenie referencji, poszukaj w Google ;)
@@KoW Przypisując materiał z pola "material", edytor poza komunikatem o błędzie, tworzy instancję materiału. Gdy następnie przypiszemy materiał z "sharedMaterial" błędu nie ma, ale materiały nadal są instancjami. Jeśli usunę materiał wszystkim sześcianom i dodam ponownie, to przy zmianie żyć zmienia się kolor wszystkich sześcianów, które korzystają z tego materiału.
Ja mam u siebie ten kod tak i śmiga: using System.Collections; using System.Collections.Generic; using UnityEngine; public class DestructBox : MonoBehaviour { public Color startColor; public Color endColor; public int life; public bool isRigidbody = false; private Material material; private int maxlife = 3; private Rigidbody rb; void Start() { life = Mathf.Clamp(life, 1, maxlife);
material = Application.isPlaying ? GetComponent().material : new Material(GetComponent().sharedMaterial); // Ustaw kolor SetColor(); if (isRigidbody) { rb = gameObject.AddComponent(); rb.interpolation = RigidbodyInterpolation.Interpolate; rb.collisionDetectionMode = CollisionDetectionMode.Continuous; rb.mass = 0.75f; } } private void OnCollisionEnter(Collision collision) { if (collision.gameObject.CompareTag("Player")) { life--; if (life > 0) { SetColor(); } else { Destroy(this.gameObject); } } } void SetColor() { if (material != null) // Sprawdź, czy materiał został już ustawiony { material.color = Color.Lerp(endColor, startColor, (float)(life - 1) / (float)(maxlife - 1)); } } private void OnValidate() { if (GetComponent() != null) // Sprawdź, czy MeshRenderer został już ustawiony { material = GetComponent().sharedMaterial; SetColor(); } } }
Siemka! Śledzę Twój kurs C# od dłuższego czasu i bardzo mi pomogłeś. Pracuje na IOS co jest troszkę utrudnieniem ale daje radę. Czy mógłbyś zrobić kurs z .Net.Core i MVC ? Nigdzie tego nie ma w miarę aktualnego a sprawa dość przydatna. Pozdrawiam :D
Kozakiem jesteś ;)
Komentarz dla zasięgu! 😁
Mam pewien problem, po skopiowaniu cuba i zmianie life tego skopiowanego cuba zmienia mi się kolor obydwóch cubów na ten sam. Natomiast life w oryginalnym cubie jest taki jak był na początku. Po odpaleniu gry wszystko sie zgadza, tylko w edytorze tak to działa.
Wynika to ze współdzielenia materiału w podglądzie sceny. Dla oszczędności miejsca jest to 1 materiał referencyjny, trzeba dostać się z kodu do tego materiału i wyłączyć współdzielenie referencji, poszukaj w Google ;)
@@KoW Przypisując materiał z pola "material", edytor poza komunikatem o błędzie, tworzy instancję materiału. Gdy następnie przypiszemy materiał z "sharedMaterial" błędu nie ma, ale materiały nadal są instancjami. Jeśli usunę materiał wszystkim sześcianom i dodam ponownie, to przy zmianie żyć zmienia się kolor wszystkich sześcianów, które korzystają z tego materiału.
Ja mam u siebie ten kod tak i śmiga:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DestructBox : MonoBehaviour
{
public Color startColor;
public Color endColor;
public int life;
public bool isRigidbody = false;
private Material material;
private int maxlife = 3;
private Rigidbody rb;
void Start()
{
life = Mathf.Clamp(life, 1, maxlife);
material = Application.isPlaying ? GetComponent().material : new Material(GetComponent().sharedMaterial);
// Ustaw kolor
SetColor();
if (isRigidbody)
{
rb = gameObject.AddComponent();
rb.interpolation = RigidbodyInterpolation.Interpolate;
rb.collisionDetectionMode = CollisionDetectionMode.Continuous;
rb.mass = 0.75f;
}
}
private void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.CompareTag("Player"))
{
life--;
if (life > 0)
{
SetColor();
}
else
{
Destroy(this.gameObject);
}
}
}
void SetColor()
{
if (material != null) // Sprawdź, czy materiał został już ustawiony
{
material.color = Color.Lerp(endColor, startColor, (float)(life - 1) / (float)(maxlife - 1));
}
}
private void OnValidate()
{
if (GetComponent() != null) // Sprawdź, czy MeshRenderer został już ustawiony
{
material = GetComponent().sharedMaterial;
SetColor();
}
}
}
Siemka! Śledzę Twój kurs C# od dłuższego czasu i bardzo mi pomogłeś. Pracuje na IOS co jest troszkę utrudnieniem ale daje radę. Czy mógłbyś zrobić kurs z .Net.Core i MVC ? Nigdzie tego nie ma w miarę aktualnego a sprawa dość przydatna. Pozdrawiam :D
100% - 33% = 67% a nie 77% 😁
🫣
16:10 Color to struktura, nie klasa. Z pozoru mały błąd a czasem wiele zamieszania może zrobić
Masz rację