Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Red88
Založen: 02. 10. 2019 Příspěvky: 6
|
Zaslal: 2. říjen 2019, 14:05:27 Předmět: Unity 3D - obrazovka s možností customizace char. a převod |
|
|
Uvítal bych radu. Jel jsem podle tutoriálu - https://www.youtube.com/playlist?list=PLBIb_auVtBwBq9S1R-j4oL0HnlDh_rpLW
V podstatě mám vytvořené menu kde si může hráč drobně customizovat postavičku viz prntscreen - https://i.nyx.cz/files/00/00/20/49/2049959_c9847070693ecbba16f8.png?name=image.png. Na obrázku je zajímavé, že vše funguje, pokud char seskočí z plošinky do hlubin i v tom nastavovacím menu, odečítají se životy, mění se poloha charu, díky Debug.Log se mi to vše krásně vypisuje.
Nicméně, nastavil jsem si tlačítko na přepnutí scén (Start). Po kliknutí na tlačítko start dojde k načtení dalšího lvlu - https://i.nyx.cz/files/00/00/20/49/2049961_66774cb086b750b2a748.png?name=image.png
V tomto lvlu mi už nefunguje ani Debug.Log na hodnoty osy Y na které se nachází Char, nefunguje ani odečítání zdraví, ani nefunguje respawn.
Netušíte co mi uniká prosím? Případně rád informace doplním, už se s tím plácám celej den a na nic moc nemůžu přijít, když nepočítám že jsem si to trochu rozsekal těma logama a zjistil, že na úvodní stránce vše funguje.
Zřejmě je to tím, že gameObject SpawnPoint(Místo pro respawn po spadnutí z plošinky) a SceneManager(Objekt se skripty pro odečítání zdraví, hlídání výšky na ose Y, atd) není součástí charakteru. Což o to, SceneManager můžu připnout na hráče a pak funguje script na odečítání zdraví a výšky na ose y i v dalším lvlu, nicméně pokud samozřejmě hierarchicky přiřadím pod charakter i SpawnPoint, tak ten se pohybuje s Charakterem, takže respawn pak sice funguje, ale charakter se respawnuje na nějaké nesmyslné souřadnice ovlivněné pádem a posunem SpawnPointu.
Prostě, potřeboval bych zřejmě přiřadit charakteru GameObject SpawnPoint a nějak docílit toho, aby byl součástí charakteru, ale nepohyboval se spolu s ním.
Nevíte jak na to prosím? Předem velmi děkuji |
|
Návrat nahoru |
|
|
abuki
Založen: 31. 07. 2012 Příspěvky: 507 Bydliště: Praha
|
|
Návrat nahoru |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 3. říjen 2019, 07:16:41 Předmět: |
|
|
Nebylo by nejlépe systémy na respawnování, odečítání životů a spol, nechat jen pro hru samotnou? V menu bych řek, že to nemá co dělat. Nebo jsem to jen nepochopil (?). _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
|
Red88
Založen: 02. 10. 2019 Příspěvky: 6
|
Zaslal: 4. říjen 2019, 10:14:03 Předmět: |
|
|
Ahoj, děkuji za rady. To je právě ten problém.
Ve scéně s úpravou charakteru mám na objektu Character (postava hráče) skript který zjišťuje pozici hráče na ose Y :
kód: |
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class LevelManager : MonoBehaviour
{
private int hitpoint = 3;
private int score = 0;
public Transform spawnPosition;
public Transform playerTransform;
//pokus
public GameObject SpawnPoint;
public Text scoreText;
public Text hitpointText;
public void Awake()
{
SpawnPoint = GameObject.Find("SpawnPoint");
//Debug.Log("X: " + playerTransform.position.y);
/*scoreText.text = "Piv : " + score.ToString();
hitpointText.text = "Životů :" + hitpoint.ToString();*/
}
// Every single frame
public void Update ()
{
//Debug.Log("X: " + playerTransform.position.y);
if (playerTransform.position.y < -10)
{
Debug.Log("X: " + playerTransform.position.y);
hitpoint--;
Debug.Log("Health: " + hitpoint);
playerTransform.position = spawnPosition.position;
if(hitpoint <=0)
{
Debug.Log("Zde Má Naskočit Menu!");
SceneManager.LoadScene("Menu");
/*playerTransform.position = spawnPosition.position;
hitpoint--;
hitpointText.text = "Životů :" + hitpoint.ToString();
if(hitpoint <=0)
{
SceneManager.LoadScene("Menu");
//Application.LoadLevel("Menu");
}*/
}
}
}
}
|
Nicméně když hru spustím, v této scéně vše funguje jak má.
[img]https://i.nyx.cz/files/00/00/20/50/2050789_72ad97c4edd34a32cfdb.png?name=levelManager_script_V_konfigMenu.png[/img]
Za povšimnutí stojí, že políčko Spawn Position má správně přiřazený SpawnPoint.
Pokud ale kliknut na tlačítko Start, které mi charakter přesune do další scény - pojmenované Level1, tak se mi krásně teleportuje charakter, nicméně Spawn Point je nevyplněn -
[img]https://i.nyx.cz/files/00/00/20/50/2050788_930a379e97ef48fc827b.png?name=levelManager_script_V_level1u.png[/img]
a dostávám chybu -
citace: |
MissingReferenceException: The object of type 'Transform' has been destroyed but you are still trying to access it.
Your script should either check if it is null or you should not destroy the object.
UnityEngine.Transform.get_position () <0x38e911c0 + 0x0006a> in <5350b2ecf18c4d938d283fb54ae35614>:0
LevelManager.Update () (at Assets/Scripts/LevelManager.cs:42) |
Ve scéně Level1 mám vytvořený Spawn Point, ale nevím jak na něj referovat na této nové pozici. Myslím, že by to můj problém řešilo.
Zkusil jsem Spawn Point vyhledat v přes findGameObject, ale zřejmě to nepoužívám správně.
Doufám že se vyjadřuju srozumitelně..
Předem moc děkuji za případnou radu! |
|
Návrat nahoru |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 4. říjen 2019, 10:37:23 Předmět: |
|
|
Řek bych, že ten spawnpoint nebo spawn position existuje v jiné scéně a zničí se při přechodu do jiné. Pak ho sice zkoušíš najít pomocí Find, ale i když najdeš SpawnPoint, spawnPosition už nepřiřadíš.
Koukni na upravenou metodu Awake() (potažmo celou třídu). Změny viz komentář /* Zmena: ...*/
Poznámka: základem všeho je, ošetřit si vstupy a výstupy třeba aspoň tim Debug.Log. Find nemusí zafungovat (ve svéně přejmenuješ point a zapomeneš na to...), nebo nějaký parametr funkce je null .... zkrátka tam, kde je šance, že se něco pokazí, tak ošetřit. Ideálně tim, že se co nejdřív někde zobrazí chyba, která je srozumitelná.
kód: |
public class LevelManager : MonoBehaviour
{
private int hitpoint = 3;
private int score = 0;
/* Zmena: spawnPosition jsem ze třídy dal pryč, stačí SpawnPoint nebo spawnPosition. Jedno, nebo druhé (a upravit použití, viz. Update). */
public GameObject SpawnPoint
public Transform playerTransform;
public Text scoreText;
public Text hitpointText;
public void Awake()
{
/* Zmena: zjisteni, ze se find podaril je nutne */
SpawnPoint = GameObject.Find("SpawnPoint");
if (SpawnPoint == null)
Debug.Log("HLEDAL SEM BLBE");
//Debug.Log("X: " + playerTransform.position.y);
/*scoreText.text = "Piv : " + score.ToString();
hitpointText.text = "Životů :" + hitpoint.ToString();*/
}
// Every single frame
public void Update ()
{
//Debug.Log("X: " + playerTransform.position.y);
if (playerTransform.position.y < -10)
{
Debug.Log("X: " + playerTransform.position.y);
hitpoint--;
Debug.Log("Health: " + hitpoint);
/* Zmena: misto zruseneho spawnPosition nahrazeno SpawnPoint.transform */
playerTransform.position = SpawnPoint.transform.position;
if(hitpoint <=0)
{
Debug.Log("Zde Má Naskočit Menu!");
SceneManager.LoadScene("Menu");
/*playerTransform.position = spawnPosition.position;
hitpoint--;
hitpointText.text = "Životů :" + hitpoint.ToString();
if(hitpoint <=0)
{
SceneManager.LoadScene("Menu");
//Application.LoadLevel("Menu");
}*/
}
}
}
} |
_________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
|
Red88
Založen: 02. 10. 2019 Příspěvky: 6
|
Zaslal: 4. říjen 2019, 10:47:47 Předmět: |
|
|
Dostávám chybu Assets\Scripts\LevelManager.cs(26,9): error CS0103: The name 'spawnPosition' does not exist in the current context
Přestože spawnpoint je definován jako
citace: |
public GameObject SpawnPoint; |
pokud se nepletu. |
|
Návrat nahoru |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 4. říjen 2019, 10:51:13 Předmět: |
|
|
Tak to tam máš určitě nějaký změny, oproti tomu skriptu, co sem dával tady na fóru. Protože "spawnPosition" tam nikde nepoužívám. _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
|
Red88
Založen: 02. 10. 2019 Příspěvky: 6
|
Zaslal: 4. říjen 2019, 10:55:49 Předmět: |
|
|
Zkopíroval jsem přesně kód který jsi poslal, opravil středník na řádku deset. Nicméně stále to nefunguje s chybovou hláškou
citace: |
MissingReferenceException: The object of type 'GameObject' has been destroyed but you are still trying to access it.
Your script should either check if it is null or you should not destroy the object.
LevelManager.Update () (at Assets/Scripts/LevelManager.cs:47) |
Přesto děkuji za snahu pomoci, vážím si toho. |
|
Návrat nahoru |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 4. říjen 2019, 10:57:52 Předmět: |
|
|
Tak to už je něco jinýho. Pokud v logu neni po Awake "HLEDAL SEM BLBE", tak to znamená, že se SpanPoint ničí někde jinde. _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
|
Red88
Založen: 02. 10. 2019 Příspěvky: 6
|
|
Návrat nahoru |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 4. říjen 2019, 11:07:59 Předmět: |
|
|
Nápad:
V Unity sem dlouho nedělal, tak mě to nenapadlo, ale Awake se volá jen jednou. Je možný, že postavičku přesuneš do jiný scény a SpawnPoint ne, takže se ztratí reference na SpawnPoint, ale postavička už Awake nezavolá.
Takže: Ten Find (i s Debug.Log) přesuň rovnou do Update() dovnitř if "if (playerTransform.position.y < -10) { ...". To by mohlo být lepší. _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
|
Red88
Založen: 02. 10. 2019 Příspěvky: 6
|
Zaslal: 4. říjen 2019, 11:15:02 Předmět: |
|
|
Děkuju! Funguje to parádně! |
|
Návrat nahoru |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
|
Návrat nahoru |
|
|
|