Jump to content
Unity Insider Forum

Elharter

Members
  • Posts

    267
  • Joined

  • Last visited

  • Days Won

    5

Elharter last won the day on September 12 2019

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,052 profile views

Elharter's Achievements

Advanced Member

Advanced Member (3/3)

21

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. Was genau meinst du damit? Den Namen oder was?
  3. 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
  4. 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
  5. Nein....sowie eingezeichnet. Ich möchte, folgend der Richtung vom 2ten Punkt zurück in einem bestimmten Abstand (den ich definieren kann+will)
  6. Hallo liebes Forum, ich möchte folgendes realisieren: Auf X steht ein Objekt, Richtung Y möchte. Möchte aber den Punkt ein wenig davor. Vector3 currPosition = x.transform.position; Vector3 goalPosition = y.transform.position; Vector3 dir = goalPosition - currPosition; Debug.DrawRay(currPosition, dir, Color.cyan, 60); (macht was es soll) Aber wie komme ich jetzt in die richtige Richtung eine feste Länge zurück? danke & lg Michael
  7. Lösung war: Bei Texture 1024x einfach x/y und mit 2 multiplizieren, bei einer 2048 entsprechend x4 - problem gelöst. closed
  8. Okay Fehler eingegrenzt...... Es liegt daran dass die 512x512 Texturen 1:1 in das TerrainSize passen, welche 512x512 Pixel hat. Lade ich eine 2048x2048 Texture in die Terrainsize von 512x512 dann stimmt natürlich die Pixelkoordinate nicht mehr überein.
  9. Hallo Kollegen, folgendes seltsames Problem: 1. Ich erzeuge einen Screenshot zur Laufzeit FlyCam.transform.localPosition = new Vector3(256, 256, 256); //256 for center position FlyCam.transform.rotation = Quaternion.Euler(90, 0, 0); FlyCam.orthographicSize = 256f; //256 for exact 512 size //FlyCam.orthographicSize = currentTerrainData.size.z / 2f; FlyCam.aspect = currentTerrainData.size.x / currentTerrainData.size.z; //FlyCam.transform.LookAt(currentTerrain.GetPosition(), currentTerrain.transform.forward); DirLight.transform.rotation = Quaternion.Euler(90, 0, 0); //pull the screensize //int resWidth = Screen.width; //int resHeight = Screen.height; int resHeight = currentTerrain.terrainData.baseMapResolution; //int resWidth = Mathf.RoundToInt(resHeight * FlyCam.aspect); int resWidth = currentTerrain.terrainData.baseMapResolution; Debug.Log("Resolution of saved texture is:" + resHeight + "/" + resWidth); RenderTexture rt = new RenderTexture(resWidth, resHeight, 24); FlyCam.targetTexture = rt; //Create new renderTexture and assign to camera Texture2D screenShot = new Texture2D(resWidth, resHeight, TextureFormat.RGB24, false); //Create new texture FlyCam.Render(); RenderTexture.active = rt; screenShot.ReadPixels(new Rect(0, 0, resWidth, resHeight), 0, 0); //Apply pixels from camera onto Texture2D FlyCam.targetTexture = null; RenderTexture.active = null; //Clean Destroy(rt); //Free memory canvasTrackEditorGo.enabled = false; // Encode texture into PNG byte[] bytes = screenShot.EncodeToPNG(); //**path is in Assets, you must refresh Unity to see the file (can be done by clicking away then click on Unity window again, etc) var fullFilewithPath = Application.streamingAssetsPath + "/" + filenamewithoutext + ".png"; //Debug.Log(fullFilewithPath); System.IO.File.WriteAllBytes(fullFilewithPath, bytes); //Save the texture new Debug.Log("Saved texture in " + fullFilewithPath); Funktioniert tadellos. Ich speichere dies als PNG ab. Lade dies in einer anderen spielbare Szene per: //set the resolution of the existing file correct Texture2D texture = new Texture2D((int)tmpTexture.width, (int)tmpTexture.height, TextureFormat.RGBA32, true); //generate mipmap texture.LoadImage(bytes); texture.Apply();//apply and create mipmap //now change the 0 element tl[0].diffuseTexture = texture; // texture is the loaded png //check resolutions and set resolutions to the image tl[0].tileSize = new Vector2(512, 512); in den ersten (0) TerrainLayer, erzeuge das MipMap. Funktioniert wunderbar. Möchte ich jedoch dann per GetPixel mir die Pixelfarbe zurückgeben lassen, an dem Ort wo mein (in meinem Fall Auto) Charakter steht, erhälte ich eine völlig falsche Farbe zurück. Auto steht hier: Debug Log Zeigt: Wobei centerPixel das ernst zunehmendste ist, weil dies die GetPixel Funktion 1:1 ist ohne jegliche Modifikationen Ich erhalte also: In Photoshop und auch optisch erkennt man dass es sich hierbei aber 100%ige um einen grauen Bereich handelt. Dieser Fehler zieht sich bei allen Texturen die größer sind durch. Bei Texturen mit 512x512 tritt der Fehler nicht auf. Ich bin völlig ratlos. lg Michael
  10. 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
  11. 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:
  12. 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
  13. Nun gut und wo tu ich das Mesh dann hin??? Das Terrain verwendet ja nen eigenen oder? Zumal die vorhandenen Terrainmeshes sich ja auf die Heightmap beziehen!?
×
×
  • Create New...