Jump to content
Unity Insider Forum

Elharter

Members
  • Posts

    267
  • Joined

  • Last visited

  • Days Won

    6

Elharter last won the day on December 8 2021

Elharter had the most liked content!

About Elharter

  • Birthday 07/17/1981

Contact Methods

  • Website URL
    www.gene-racing.com

Profile Information

  • Gender
    Male
  • Location
    Vienna

Recent Profile Visitors

2,335 profile views

Elharter's Achievements

Advanced Member

Advanced Member (3/3)

22

Reputation

  1. Also ich löse das so sehr ähnlich, jedoch entscheiden die Spieler in der Lobby welche Farbe sie haben können und sehen das auch direkt. Ich habe 2 Pfeile für links/rechts um die Farbe zu wechseln und habe, der einfachheithalber, farben fix vorgegeben. Hier siehst du die Pfeile neben dem Auto. Bei jedem clickt synct PUN zu allen verbundenen Clients und merkt sich den Status. Variablen: public Color[] colors = new Color[10]; //the color array to change the car color rivate int carIndex = 0; //define car Colors in array colors[0] = new Color32(167, 167, 167, 255); //grey colors[1] = new Color32(0, 171, 36, 255); //green colors[2] = new Color32(143, 0, 0, 255); //red colors[3] = new Color32(241, 255, 0, 255); //yellow colors[4] = new Color32(255, 0, 185, 255); //pink colors[5] = new Color32(255, 153, 0, 255); //orange colors[6] = new Color32(0, 23, 255, 255); //blue colors[7] = new Color32(0, 0, 0, 255); //black colors[8] = new Color32(0, 255, 244, 255); //turquoise colors[9] = new Color32(84, 30, 178, 255); //purple Ich habe hierzu 2 Methoden: Pfeil nach rechts/links public void NextCar() { carIndex = (carIndex + 1) % colors.Length; SetCustomProperties(Photon.Pun.PhotonNetwork.LocalPlayer, carIndex, (int)Photon.Pun.PhotonNetwork.LocalPlayer.CustomProperties["spawn"], false, qualifiyingmode, qualirounds, qualitime, qualigrid, qualifinished, steamidstring, totalLaps); Debug.Log("CarIndex:" + carIndex); int playerIndex = 0; foreach (Photon.Realtime.Player p in Photon.Pun.PhotonNetwork.PlayerList) { Transform playerMenu = playerMenus[playerIndex++]; if (p == Photon.Pun.PhotonNetwork.LocalPlayer) { /* Renderer rend = playerMenu.Find("SelectedPlayerCar/RaceCarCanvas/RaceCar/RaceCar/Body").gameObject.GetComponent<Renderer>(); //Set the main Color of the Material to green rend.material.shader = Shader.Find("Standard"); rend.material.SetColor("_Color", colors[carIndex]); */ // New code with different materials Renderer colorMat = playerMenu.Find("SelectedPlayerCar/RaceCarCanvas/RaceCar/RaceCar/Body").gameObject.GetComponent<Renderer>(); if (colorMat != null) { Material[] matArray = colorMat.materials; //get the current materials // overwrite it with the two hardcoded materials matArray[0] = mats[carIndex]; matArray[1] = default_mat;//is black colorMat.materials = matArray; } else { //Debug.Log("PUNRoom_Handler:No Mesh Renderer found at the race-car"); } } } } public void PreviousCar() { carIndex--; if (carIndex < 0) carIndex = colors.Length - 1; SetCustomProperties(Photon.Pun.PhotonNetwork.LocalPlayer, carIndex, (int)Photon.Pun.PhotonNetwork.LocalPlayer.CustomProperties["spawn"], false, qualifiyingmode, qualirounds, qualitime, qualigrid, qualifinished, steamidstring, totalLaps); Debug.Log("CarIndex:" + carIndex); int playerIndex = 0; foreach (Photon.Realtime.Player p in Photon.Pun.PhotonNetwork.PlayerList) { Transform playerMenu = playerMenus[playerIndex++]; if (p == Photon.Pun.PhotonNetwork.LocalPlayer) { /* Renderer rend = playerMenu.Find("SelectedPlayerCar/RaceCarCanvas/RaceCar/RaceCar/Body").gameObject.GetComponent<Renderer>(); //Set the main Color of the Material to green rend.material.shader = Shader.Find("Standard"); rend.material.SetColor("_Color", colors[carIndex]); */ // New code with different materials Renderer colorMat = playerMenu.Find("SelectedPlayerCar/RaceCarCanvas/RaceCar/RaceCar/Body").gameObject.GetComponent<Renderer>(); if (colorMat != null) { //Debug.Log("PUNRoom_Handler:colorMat is not null"); Material[] matArray = colorMat.materials; //get the current materials //Debug.Log("PUNRoom_Handler:material0"+matArray[0]); //Debug.Log("PUNRoom_Handler:material1"+matArray[1]); // overwrite it with the two hardcoded materials matArray[0] = mats[carIndex]; matArray[1] = default_mat;//is black colorMat.materials = matArray; } else { //Debug.Log("PUNRoom_Handler:No Mesh Renderer found at the race-car"); } } } } Dann verwende ich die OnPhotonPlayerPropertiesChanged Methode um auf allen Clients jeden Change mit zu bekommen: public void OnPhotonPlayerPropertiesChanged(object[] playerAndUpdatedProps) { Debug.Log("PUNRoom_Handler:PUNRoom_handler:OnPhotonPlayerPropertiesChanged called"); UpdatePlayerList(); } dH wenn einer der Spieler die Farbe ändert, callen alle Spieler im sellben Raum die UpdatePlayerList(); Und in der UpdatePlayerList() schaue ich mir einfach an was "ich als Client" empfangen habe und weise es entsprechend dem richtigen Auto zu. public void UpdatePlayerList() { foreach (Photon.Realtime.Player p in Photon.Pun.PhotonNetwork.PlayerList) { Transform playerMenu = playerMenus[playerIndex++]; if (p.CustomProperties.ContainsKey("car")) {Renderer colorMat = playerMenu.Find("SelectedPlayerCar/RaceCarCanvas/RaceCar/RaceCar/Body").gameObject.GetComponent<Renderer>(); if (colorMat != null) { //Debug.Log("PUNRoom_Handler:colorMat is not null"); Material[] matArray = colorMat.materials; //get the current materials //Debug.Log("PUNRoom_Handler:material0"+matArray[0]); //Debug.Log("PUNRoom_Handler:material1"+matArray[1]); // overwrite it with the two hardcoded materials Debug.Log("PUNRoom_Handler:current customproperties for car:" + (int)p.CustomProperties["car"]); matArray[0] = mats[(int)p.CustomProperties["car"]]; matArray[1] = default_mat;//is black //Debug.Log("+++++++++++++++++++++++AFTER first asssign+++++++++++++++++++++++++++++++"); //Debug.Log("PUNRoom_Handler:material0"+matArray[0]); //Debug.Log("PUNRoom_Handler:material1"+matArray[1]); colorMat.materials = matArray; } else { Debug.Log("PUNRoom_Handler:No Mesh Renderer found at the race-car"); } } } Fertig ist der ganze Streich.... lg
  2. Hallo Splashy, also Steamworks als Network-API zu verwenden habe ich noch nie gehört. Wie kommst du zu dieser Entscheidung? Ja, also ich würde PhotonPUN2 für einfache Dinge, oder Mirror für komplexere Anwendungen verwenden. Es gibt natürlich eine Vielzahl mehr. Ich habe mein Spiel (GeneRacing) auf PUN2 mit Steamworks und migriere gerade auf Mirror, weil mir die Möglichkeiten bei PUN2 ausgegangen sind. lg
  3. Elharter

    Rennspiel

    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
  4. 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: 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: 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: 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
  5. 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:
  6. 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++; } } 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
  7. Check mal in Unity ob du eine "Success" oder eine "Build error" Fehlermeldung erhalten hast, nachdem Build....das sagt dir mehr
  8. Wie gerne hätte ich jetzt zu diesem alten, sehr guten Tut, die BIlder zurück *heul*
  9. 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; } } } }
  10. 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: 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
  11. 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
  12. 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"; } } }
  13. 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
  14. 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
×
×
  • Create New...