.[ ČeskéHry.cz ].
Unity 3D - obrazovka s možností customizace char. a převod

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Red88



Založen: 02. 10. 2019
Příspěvky: 6

PříspěvekZaslal: 2. říjen 2019, 14:05:27    Předmět: Unity 3D - obrazovka s možností customizace char. a převod Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
abuki



Založen: 31. 07. 2012
Příspěvky: 498
Bydliště: Praha

PříspěvekZaslal: 2. říjen 2019, 22:24:30    Předmět: Odpovědět s citátem

Z toho co píšeš není úplně přesně zřejmé co je problém a vzhledem k tomu, že se zdá, že začínáš, tak těch problémů tam může být vícero.

Zkušenějšího bych asi odkázal na tohle: https://www.youtube.com/watch?v=6vmRwLYWNRo
Ale to je pro tebe zatím overkill.

Každopádně SpawnPoint objekt nemusí přeci být v hierarchii postavy. Může být mimo a můžeš ho normálně referencovat. Buď přímo ve scéně nebo pokud to chceš mít univerzální, tak použít nějakou vyhledávací metodu jako např:
https://docs.unity3d.com/ScriptReference/Object.FindObjectOfType.html
https://docs.unity3d.com/ScriptReference/GameObject.FindWithTag.html
A nebo, ale to už mi přijde největší prasárna:
https://docs.unity3d.com/ScriptReference/GameObject.Find.html

Jinak do budoucna by to chtělo řešit nějak lépe systémově, ale tak k tomu se snad dopracuješ časem.
_________________
Twitter @abukac
www.circusatos.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
]semo[



Založen: 29. 07. 2007
Příspěvky: 1469
Bydliště: Telč

PříspěvekZaslal: 3. říjen 2019, 07:16:41    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Red88



Založen: 02. 10. 2019
Příspěvky: 6

PříspěvekZaslal: 4. říjen 2019, 10:14:03    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
]semo[



Založen: 29. 07. 2007
Příspěvky: 1469
Bydliště: Telč

PříspěvekZaslal: 4. říjen 2019, 10:37:23    Předmět: Odpovědět s citátem

Ř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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Red88



Založen: 02. 10. 2019
Příspěvky: 6

PříspěvekZaslal: 4. říjen 2019, 10:47:47    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
]semo[



Založen: 29. 07. 2007
Příspěvky: 1469
Bydliště: Telč

PříspěvekZaslal: 4. říjen 2019, 10:51:13    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Red88



Založen: 02. 10. 2019
Příspěvky: 6

PříspěvekZaslal: 4. říjen 2019, 10:55:49    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
]semo[



Založen: 29. 07. 2007
Příspěvky: 1469
Bydliště: Telč

PříspěvekZaslal: 4. říjen 2019, 10:57:52    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Red88



Založen: 02. 10. 2019
Příspěvky: 6

PříspěvekZaslal: 4. říjen 2019, 11:07:08    Předmět: Odpovědět s citátem

To mi právě nejde do hlavy, protože pokud po stisknutí tlačítka start dostanu do scény Level1, tak spawnPoint je přítomen ale nenajde jej to :-/
https://i.nyx.cz/files/00/00/20/50/2050810_08737f3c2911e5de65eb.png?name=spawnPoint.png
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
]semo[



Založen: 29. 07. 2007
Příspěvky: 1469
Bydliště: Telč

PříspěvekZaslal: 4. říjen 2019, 11:07:59    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Red88



Založen: 02. 10. 2019
Příspěvky: 6

PříspěvekZaslal: 4. říjen 2019, 11:15:02    Předmět: Odpovědět s citátem

Děkuju! Funguje to parádně!
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
]semo[



Založen: 29. 07. 2007
Příspěvky: 1469
Bydliště: Telč

PříspěvekZaslal: 4. říjen 2019, 11:15:44    Předmět: Odpovědět s citátem

bomba :)
_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna