Jump to content
Unity Insider Forum

Elharter

Members
  • Gesamte Inhalte

    267
  • Benutzer seit

  • Letzter Besuch

  • Tagessiege

    6

Beiträge erstellt von Elharter

  1. Nachdem ich ja auch seit über 2 JAhren ein Rennspiel entwickle (GeneRacing) frage ich mich wie du die Physics gelöst hast !?

    In deinem letzten Post schreibsti du auch dass du eine RayCast Version gebaut hast, gibt es die schon zu sehen? Ich überlege auch seit geraumer Zeit alles auf Raycasting umzubauen.

     

    lg

  2. Hey,

    so kurz wie möglich erklärt.

    Ich habe einige GameObjekte die prozedural spawnen. Nachdem ich auch über Brücken verfüge (die im Terrain durchaus darunter hohl sein können) kann ich sie nicht wie üblich mit einem mittigen Raycast nach unten spawnen lassen. Bei allen anderen Objekten schieße ich einen Raycast nach unten, ermittle so die Geländehöhe und spawne es dann dort. Geht wunderbar. Bei Brücken mit Hohlraum darunter natürlich nicht. 

    Ergebnis sieht dann so aus:

    image.png.a25e3a979a4cb9057300dff4886bd2e4.png

    Das ist natürlich Blödsinn.

    Aus diesem Grund habe ich bei allen Objekten, dort wo ich es für gut befinde eine einfaches GameObjekt als Child verwendet um zu definieren WO ich die Höhe prüfen möchte.

    Im Falle der Brücke sind das die Beine. Also zb so:

    image.png.4d2d60a2e48c1f3fed7c47d076a91603.png

     

    Beim spawnen prüfen ich nun ob ein "Heightpoint" vorhanden ist um dann nachfolgenden VON DORT einen Raycast (statt der Mitte) nach unten zu schießen.

    Funktioniert nur nicht. Es wird ständig die MItte das Parents genommen.
    Siehe hier das ergebnis als DrawRay:

    image.png.fb15be4c333f43d606c4c4e33ceee2b8.png

     

    Nach 2h Fehler suchen, brauche ich eure Hilfe :( ich stehe an.

     

      Vector3 totrans;
            bool heightpfound = false;
    
            if (trackObject.transform.Find("Heightpoint") != null)
            {
                GameObject hp = trackObject.transform.Find("Heightpoint").gameObject;
                totrans = hp.transform.position;
                Debug.Log("Heightpoint found, use it: Name is:"+ hp.name);
                heightpfound = true;
                Debug.Log("Heightpoint position is:" + totrans);
            } else
            {
                totrans = trackObject.transform.position;
                Debug.Log("NO Heightpoint found, use center");
            }
            Debug.Log("GameObject Position is:" + trackObject.transform.position);
            if (Physics.Raycast(totrans, Vector3.down, out hit))
            {
                distanceToGround = hit.distance;
                Vector3 incomingVec = hit.point - totrans;
                Vector3 reflectVec = Vector3.Reflect(incomingVec, hit.normal);
                if (heightpfound)
                {
                    Debug.DrawLine(totrans, hit.point, Color.red, 60, false); //show-spawn line
                    Debug.DrawRay(hit.point, reflectVec, Color.green, 60, false); //show reflection-line
                }
                if (!hit.transform.gameObject.name.Contains("Terrain"))
                {
                    Debug.DrawLine(totrans, hit.point, Color.yellow, 60, false); //show line if the object didnt hit terrain
                    Debug.Log("Object " + prefab + "/ hitted:" + hit.transform.gameObject);
                }
    
                    trackObject.transform.position = hit.point;
                    if (TerrainRotation == true)
                    {
                        trackObject.transform.rotation = Quaternion.FromToRotation(Vector3.up, hit.normal);
                        //trackObject.transform.rotation = Quaternion.FromToRotation(transform.up, hit.normal) * trackObject.transform.rotation;
                    }
            }

    Debug.Log gibt eindeutig unterschiedliche Werte aus....trotzdem sehe ich die Raycasts immer mittig und auch der Spawn funktoniert nicht wie man sieht.

     

    lg

     

     

    Michael

  3. Ich hab den Code jetzt nochmal verändert zu diesem:

     

        void OnMouseOver()
        {
            Debug.Log("Mouse is over:" + gameObject.name);
            Renderer[] rs = gameObject.GetComponentsInChildren<Renderer>();
            int i = 0;
            foreach (Renderer r in rs)
            {
                Material m = r.material;
                Debug.Log("Materialname is:" + m.name);
                newColor = new Color(m.color.r, m.color.g, m.color.b, 0.25f);
                //newMaterial.SetColor("Color", newColor);
                //newMaterial.SetColor("_Color", newColor);
                m.EnableKeyword("_BaseColor");
                m.SetColor("_BaseColor", newColor);
                m.color = newColor;
                m.EnableKeyword("_Surface");
                m.SetFloat("_Surface", (float)SurfaceType.Transparent);
                i++;
            }
        }
        void OnMouseExit()
        {
            Debug.Log("Mouse is exited from:" + gameObject.name);
            Renderer[] rs = gameObject.GetComponentsInChildren<Renderer>();
            int i = 0;
            foreach (Renderer r in rs)
            {
                Material m = r.material;
                newColor = new Color(m.color.r, m.color.g, m.color.b, 1f);
                m.EnableKeyword("_BaseColor");
                m.SetColor("_BaseColor", newColor);
                m.color = newColor;
                m.EnableKeyword("_Surface");
                m.SetFloat("_Surface", (float)SurfaceType.Opaque);
                i++;
            }
    
        }

    selbes Verhalten..... GANZ komisch...

    Siehe Video hier:

     

  4. Hey Kollegen,

    nun mein Code:

    void OnMouseOver()
        {
            Debug.Log("Mouse is over:" + gameObject.name);
            Renderer[] rs = gameObject.GetComponentsInChildren<Renderer>();
            int i = 0;
            foreach (Renderer r in rs)
            {
                Material m = r.material;
                Debug.Log("Materialname is:" + m.name);
                oldMaterial = r.material;
                oldColor = r.material.color;
                newMaterial = new Material(oldMaterial);
                newColor = new Color(oldColor.r, oldColor.g, oldColor.b, 0.10f);
                //newMaterial.SetColor("Color", newColor);
                //newMaterial.SetColor("_Color", newColor);
                newMaterial.SetColor("_BaseColor", newColor);
                newMaterial.color = newColor;
                newMaterial.EnableKeyword("_Surface");
                newMaterial.SetFloat("_Surface", (float)SurfaceType.Transparent);
                newMaterial.name = "Modified Material";
                r.material = newMaterial;
                i++;
            }
        }
        void OnMouseExit()
        {
            Debug.Log("Mouse is exited from:" + gameObject.name);
            Renderer[] rs = gameObject.GetComponentsInChildren<Renderer>();
            int i = 0;
            foreach (Renderer r in rs)
            {
                r.material = oldMaterial;
                i++;
            }
    
        }

    image.png.0018bfc528643bb1d0a3f94e2f06bc8f.png

    Ganz seltsames Verhalten. Grundsätzlich: es passiert nix. Weder die Farbe, noch das Surfacetype ändert sich.

    Clicke ich jedoch im Inspector und klappe den Shader AUF, nimmt er den neuen Wert einmal an.
    (Ich benutze URP)

    Was ist hier los? Jemand eine Idee?

     

    danke

  5. Rein informativ noch, damit man ein wenig Code sieht:

    Listenelemente werden so instanziert:

    GameObject track_sync_ListContentPanel = Instantiate(Track_SyncTrackListPrefab, SyncTrackListContent.transform);
    track_sync_ListContentPanel.transform.SetParent(SyncTrackListContent.transform);

     

    Füllen des Bildes links am Rand erfolgt zurzeit so:

    //fill track image in
    Transform TrackAvatar = track_sync_ListContentPanel.transform.Find("TrackImage Column/Avatar").transform;
    StartCoroutine(GetTrackScreenshot(data.filename.ToString().ToLower(), TrackAvatar));

     

    Die CoRoutine GetTrackScreenshot sieht wie folgt aus:

     IEnumerator GetTrackScreenshot(string filename, Transform avatar)
        {
            string extractedfilename = filename.Replace(".trk", "_screenshot.png");
            string path = "http://www.gene-racing.com/tracks/" + extractedfilename;
            UnityWebRequest www = UnityWebRequestTexture.GetTexture(path);
            yield return www.SendWebRequest();
    
            yield return new WaitForSeconds(1);
    
            if (www.isNetworkError || www.isHttpError)
            {
                Debug.Log("WWW Error:");
                Debug.Log(www.error);
            }
            else
            {
                Debug.Log("NO www error:");
                //set new textures
                GameObject[] syncItems = GameObject.FindGameObjectsWithTag("Tracks_SyncTrackListItem");
                foreach (GameObject prefab in syncItems)
                {
                    Transform TrackFileName = prefab.transform.Find("TrackName").transform;
                    Debug.Log("Trackname of SyncTrackListItem is:" + TrackFileName.GetComponent<Text>().text);
                    if(TrackFileName.GetComponent<Text>().text.ToString().ToLower() == filename)
                    {
                        //find the parent avatar of it
                        Transform avatarfound = TrackFileName.parent.Find("TrackImage Column/Avatar").transform;
                        //Reset textures first, to avoid see old pictures
                        Destroy(avatarfound.GetComponent<RawImage>().material.mainTexture);
                        Destroy(avatarfound.GetComponent<RawImage>().texture);
                        avatarfound.GetComponent<RawImage>().material.mainTexture = ((DownloadHandlerTexture)www.downloadHandler).texture;
                        avatarfound.GetComponent<RawImage>().texture = ((DownloadHandlerTexture)www.downloadHandler).texture;
                    }
                }
                
                
            }
        }

     

  6. Hallo liebes Forum,

    ich habe folgendes Problem:

    Eine Scrollview. Darin enthalten sind natürlich etliche Listenitems. Ich habe mir ein Muster gebaut, dieses als Prefab gespeichert um es dann jeweils laden zu können.

    Die einzelnen Items (Prefabs) die ich dann innerhalb der ScrollView lade, lade ich per JSON aus einer MySQL DB aus dem Web. Funktioniert alles prima und wunderbar.

    Problem das ich nun habe:

    Ich möchte zu jedem einzelnen EIntrag eine Grafik laden, der per URL an Unity übertragen wird um in jedem Listeneintrag die dazupassende Grafik anzeigen zu können.
    Sämtlicher Inhalt kommt per JSON aus einer DB.

    Zur Veranschaulichung ein Screenshot:

    image.thumb.png.20406839b5423f2bf649004d85ae51f0.png

     

    Nun. Die Bilder sollten links sein.... sowie dieses eine das man sehen kann.

    Zurzeit lade ich die Bilder per CoRoutine:

     IEnumerator GetTrackScreenshot(string filename, Transform avatar)
        { .....

    Das Problem ist aber dass ich zwar das Transform des einzelnen Listenelements mitgeben kann - aber bei einem einfachen Reload der gesamten Liste, werden alle Grafiken vertauscht und stehen an falschen Stellen.

    Deswegen 2 Fragen:

    a) muss ich die Grafiken asynchron , per CoRoutine, laden?

    b) wie übergebe ich eine frisch instanziertes Listenelement SO an die CORoutine dass diese auch 100%ig weiß welches listenelemt betroffen ist?

     

    Ich habe jetzt alle Varianten durchprobiert und komme nicht auf den Fehler. Entweder verschieben sich alle Grafiken, oder es werden gar keine angezeigt.

    lg

    image.png

  7. Alpha 0.0.7h - a little preview

    [youtube]http://www.youtube.com/watch?v=QhiF9d_Oo_g[/youtube]

    https://www.youtube.com/watch?v=QhiF9d_Oo_g&feature=youtu.be

    Buaxyies Track
    0.0.7h Preview

    Showing:
    -Network stats (F5)
    -Day/Night Cycle
    -Lights (carlight, sunlight, street lamps)
    -BlobLight
    -PitBox
    -Damage
    -Refuel/damage repair/tire change
    -Reset Car (one Hit) and back to current waypoint
    -Camera rotation
    -Camera zooming
    -Camera follow cam
    -Camera reset to default
    -Camera change between perspective/ortographic
    -Qualifiying 10 rounds
    -Best lap times
    -Best world records regarding current track
    -Tracktime +/- difference to bestlap

    Biggest approch currently is to get the car-importer ready to use... (fbx-files), thats why we are late
    greetings
  8. behoben

     

     public void UpdateQualifiyingScoreBoard()
        {
            QualiPanelText.text = "Quali-Drivers: "+cntOnlinePlayersLoop+"\n";
            foreach (Player p in PhotonNetwork.PlayerList)
            {
                //QualiPanelText.text += "\n" + p.NickName+":"+p.GetBestLap();
                // Insert Listentrys the first time
                if (qBestLapOrderList.Count < PhotonNetwork.PlayerList.Length)
                {
                     qBestLapOrderList.Add(new qBestLapOrder(p.NickName, p.GetBestLap()));
                   }
                for (int cnt = 0; cnt < qBestLapOrderList.Count; cnt++)
                {
                    // Update List Entry everytime after first insert
                    if(qBestLapOrderList[cnt].qNickname == p.NickName)
                    {
                        qBestLapOrderList[cnt].qBestLap = p.GetBestLap();
                    }
                   
                }
                //qBestLapOrderList = qBestLapOrderList.OrderBy(qBestLapOrderList.).ToList();
                //qBestLapOrderList.Sort(SortByBestLap);
                qBestLapOrderList.Sort((l1, l2) => l1.qBestLap.CompareTo(l2.qBestLap));
    
            }
            for (int cnt = 0; cnt < qBestLapOrderList.Count; cnt++)
            {
                float tmpbestlap = qBestLapOrderList[cnt].qBestLap;
                int minutes_b = Mathf.FloorToInt(tmpbestlap / 60F);
                int seconds_b = Mathf.FloorToInt(tmpbestlap - minutes_b * 60);
                int milliseconds_b = Mathf.FloorToInt((tmpbestlap - seconds_b) * 100);
                string niceTime_b = string.Format("{0:0}:{1:00}:{2:00}", minutes_b, seconds_b, milliseconds_b);
    
                if (qBestLapOrderList[cnt].qBestLap > 1)
                {
                    QualiPanelText.text += "P" + (cnt + 1) + "." + qBestLapOrderList[cnt].qNickname + "(" + niceTime_b + ")\n";
                }
            }
    
        }

     

  9. Hallo,

    ich hänge, kann mir bitte jemand weiter helfen:

     

     public void UpdateQualifiyingScoreBoard()
        {
            QualiPanelText.text = "Online-Players:"+cntOnlinePlayersLoop+"\n";
            foreach (Player p in PhotonNetwork.PlayerList)
            {
                if (qBestLapOrderList.Count < PhotonNetwork.PlayerList.Length)
                { 
                    qBestLapOrderList.Add(new qBestLapOrder(p.NickName, p.GetBestLap()));
                    qBestLapOrderList.Sort(SortByBestLap);
    
                }
                for (int cnt = 0; cnt < qBestLapOrderList.Count; cnt++)
                {
                    qBestLapOrderList[cnt].qBestLap = p.GetBestLap();
    
                    float tmpbestlap = p.GetBestLap();
                    int minutes_b = Mathf.FloorToInt(tmpbestlap / 60F);
                    int seconds_b = Mathf.FloorToInt(tmpbestlap - minutes_b * 60);
                    int milliseconds_b = Mathf.FloorToInt((tmpbestlap - seconds_b) * 100);
                    string niceTime_b = string.Format("{0:0}:{1:00}:{2:00}", minutes_b, seconds_b, milliseconds_b);
    
                    QualiPanelText.text += qBestLapOrderList[cnt].qNickname + ":" + niceTime_b;
                }
            }
    
        }
    
        public static int SortByBestLap(qBestLapOrder p1, qBestLapOrder p2)
        {
            return p1.qBestLap.CompareTo(p2.qBestLap);
        }

     

    Ich raff die CompareTo Methode nicht ganz..... ich will 1-12 Spieler sortieren. 
    Kurz erklärt:

    1,2,3 oder 12 Spieler fahren ein Qualifiying. Ich sende über CustomProperties die Bestlap und verarbeite diese. Somit verfüge ich zentral über die BestLap jedes gejointen Fahrers.
    Nun möchte ich diese Liste sortieren. Schnellster ganz oben, langsamster ganz unten.

    Passiert aber nicht. Was mache ich falsch?

    danke 

  10. Hey,

    hat jemand eine Ahnung wie ich einen Ingame-Lag analyisieren oder herausfinden könnte?

    Wenn ich einen Build erstelle läuft alles flüssig.... konkret geht es um ein gewöhnliches ScrollRect das ich per instanzierte Listenelemente befülle. Starte ich den Build im Editor ist es mir fast niht möglich zu scrollen.

     

    danke & lg

  11.    Hallo,

     

    bitte um Hilfe, ich stehe an... wenn ich ein mehrdimensionales Array in einer Klasse anlege, wie kann ich dann darauf zugreifen?

    Ich steh gerade komplett an :(

    tracks wird gefüllt per JSON Script (TrackInfo tracks = JsonUtility.FromJson<TrackInfo>(www.text);)

     

    danke

        [System.Serializable]
        public class RootObject
        {
            public TrackInfo[] tracks;
        }
    
        [System.Serializable]
        public class TrackInfo
        {
            public int id;
            public int userid;
            public int steamuserid;
            public string filename;
            public int filesize;
            public string filehash;
    
        }

     

  12. Du drehst das monster SELBST nirgendwo..... du bewegst es in alle möglichen Richtungen.

     

    Du musst das monster per Rotate in sich noch drehen damit es sich auch dorthin schaut wo du es willst :)

    Mir ist noch ein wenig unklar was und wie du drehen willst. Welche Perspektive? Was soll sich mit welcher Eingabe drehen?
    Es hängt ja auch alles immer von der Perspektive ab.

    Aber grundsätzlich: du willst das sich das Objekt (monster) selbst auch dreht .....dH dh wenn du nach rechts gehst, soll sich das Gesicht von dem Monster auch nach rechts drehen.

  13. Ausgehend von 4 Wheelcollider, Suspension einem Box Collider usw..... wie bewerkstellige ich eine realitische Kollision zwischen 2 Autos?

    In meinem Fall kollidieren 2 Autos, angenommen eines steht das andere Auto fährt mit Vollgas seitlich in das stehende.

    Was passiert nun: das Auto das zuvor (angenommen) 200km/h gefahren ist bleibt ruckartig stehen. Das stehende Auto bewegt sich kaum.

    Das ist natürlich Schwachsinn.

    Wie kann ich ein realistischeres Verhalten bewerkstelligen?
    Gibt es irgendwelche Tuts oder Youtube videos dazu die ihr kennt?

     

    danke

     

     

    Michael

  14. Hallo,

     

    ich habe eine relativ Komplexe Fahrphysik auf einem Auto. Viele Teile werden erst mit Awake initialisiert und dann an das Parent attached.

     

    Aus diesem Grund habe ich eine Art leeres GameObject das alle Car-Komponenten beinhält.

     

    So....das ist jetzt gerade blöd... weil ich beim instanzieren mit Photon eine "View" in dem Parent benötige. Kann ich zwar machen, nur funktioniert natürlich der Sync nicht - da das Parent sich nicht bewegt (sondern nur die Chils darunter).

     

    Was kann ich tun?

     

    lg

     

     

     

    Mike

    p.s. das verwenden einer non-observed View im Parent und einer richtigen View im Child funktioniert nicht, da dann Wheels+Physics nicht gesynct werden (da in eigenen Childs).....ich müsste also jedes Child mit einer View versehen > ergo > Overload.

  15. Bei den meisten Tips die hier vorgestellt wurden handelt sich immer um Splines , die kann man ja auch runtime "zeichen"

    Vielleicht solltest du dich wirklich mal in die Richtung schlau machen ?

     

    Ja "Spline" klingt schon mal sehr gut als Stichwort....lässt sich gut scripten. Ist noch die Frage ob man auf ein Spline eben Texturen legen kann damit das Curb eben dann auch wie ein Curb aussieht :)

     

    Aber rein logisch betrachtet klingt das passend.

     

    @kakashi: wie gesagt, mir gehts eigentlich mehr um die Curbs als um die Strecke. Die Strecke möchte ich gerne mit einem Pinsel zeichnen.

  16. Ja genau das will ich eben nicht.... ich will "keine" Teile haben.... ich möchte dass der Spieler sich seine Strecke beliebig zeichnen kann. Stärke, länge, Dicke, kurvenradius, alles....mit einem Pinsel.

     

    Nur er soll eben die Möglichkeit bekommen rot/weiße "Curbs" die Kurve entlang zeichnen zu können. Funktion brauchen die keine haben, muss nur rot/weiß sein.

  17. Elharter: Das ist ja ein toller zufall, das bild dass Du gepostet hast, ist eines von einer Ftoreihe, von der ich eins für ein Game verwendet habe

     

    http://zfx.info/view...634&hilit=japan

     

    Dafür habe ich mehrer japanische Rennstrecken mithilfe von google earth nachgezeichnet. Die sind aber noch ohne textur, weil ich später einen multytexture shader verwenden wollte um die übergänge von sand zur wiese vliessender gestallten wollte. Und seit heute habe ich unity und dachte hier ist terain(als blender modell) bemalen ein kinder spiel :)

     

    Mhhh naja das "malen" ist sicher ein Kinderspiel....aber es hört auf lustig zu werden wenn du schön gerade Geraden haben möchtest oder eine ordentlich gebogene Kurve zb.... oder du eben Curbs benötigst.

     

    @Bemmi: ja das würde grundlegend gehen, begrenzt den Spieler aber zu sehr da dann nur eine begrenzte Anzahl an Streckenverianten möglich sind. Ein grenzenloses "malen" bewirkt da schier undenkbare offene Möglichkeiten.

     

    Setzt aber voraus dass es eben eine Möglichkeit gibt das entsprechend auch umzusetzen.

  18. So wie du dir das vorstellst funktioniert das nicht.

     

    Auf ein Terrain wir keine Textur gemappt so wie du es vielleicht von einem Mesh (Plan) kennst.

    Wenn du ein Terrain hättest das beispielsweise 1024 *1024 m groß ist und du würdest darauf eine 1024px * 1024 üx Textur legen dann hättest du pro qm gerade mal ein Pixel.

    Darum verwendet man bei Terrain einen Trick in dem man mehre Texturen gekachelt über das Terrain legt.

    (Diese legst du ja in den Terrain Settings fest)

     

    Mit dem Pinsel zeichnest du das die Textur aufs Terrain sondern du definierst nur wo welche Textur auf dem Terrain sichtbar sein soll.

     

    Wenn du in Photoshop schonmal mit Masken gearbeitet hast dann weißt du das es dort Schwarz/ Weiß Masken gibt. Bei einem Terrain gibt sind dies aber im Prinzip Masken mit mehren Farben.

    Du Zeichnest nicht die Farbe auf das Terrain sondern eine Maske diese Maske die du zeichnest nennt man auch Splatmap.

     

    So sieht das dann beispielsweise aus: https://www.world-ma...23/splatmap.jpg

     

    Deswegen sind Texturen auf dem Terrain nur gekachelt möglich.

     

    Es gibt aber einige Möglich:

     

    1.Du könntest ein Decal system verwenden.

    Siehe:

    https://www.assetsto...!/content/13889

     

    2. Du könntest eine extra Textur mit Dirt zu deinen Texturen hinzufügen und sie an besten Stellen sichtbar machen.

     

    3.Du könntest kurz über deiner Strasse eine Plane plazieren ´worauf du zb Reifenspuren zeichnest und dieses Material mit einer Alpha map zum teil Transparenz machen (Fake Decal)

     

    Wow! Das ist mal eine Erklärung wie sie im Buche steht! Danke dir recht herzlich dafür!

     

    2+3 verstehe ich nicht, da ich ja gebogene Curbs zeichnen möchte

    racing-curbs-3034418.jpg

     

    Das mit den Decals klingt gut!

     

    @fairygirl: danke, das habe ich bereits vor paar Tagen getestet. Hilft mir aber nicht, da sich das System nur schwer in einen Map/Trackeditor einbinden lässt und es außerdem zu komplex ist für das was ich benötige.

×
×
  • Neu erstellen...