Iboshido Geschrieben 12. Mai 2019 Melden Share Geschrieben 12. Mai 2019 Hey Leute, ich habe ein Gameobjekt "ball", welches aus einer Kanone geschossen wird. Ich habe zur Berechnung der Flugbahn des Balles einen Code aus dem Netz. Es hat wunderbar funktioniert, bis ich ein paar weitere Zeilen Code im ball hinzugefügt habe, damit der ball eine realistischeres physikalisches verhalten hat. Nun funktioniert aber natürlich die Berechnung der Flugbahn nicht mehr, da das neue physikalische Verhalten des balls nicht in die Berechnung der Flugbahn geht. Code um die Flugbahn zu Berechnen: void Update() { for (int k = 0; k < numberOfDots; k++) { x1 = ballPos.x + shotForce.x * Time.fixedDeltaTime * (dotSeparation * k + dotShift); y1 = ballPos.y + shotForce.y * Time.fixedDeltaTime * (dotSeparation * k + dotShift) - (-Physics2D.gravity.y / 2f * Time.fixedDeltaTime * Time.fixedDeltaTime * (dotSeparation * k + dotShift) * (dotSeparation * k + dotShift)); dots[k].transform.position = new Vector3(x1, y1, dots[k].transform.position.z); } Code um dem Ball eine realistischeres physikalisches Verhalten zu geben: void Update() { if (rb2d.velocity.y < 0) { rb2d.velocity += Vector2.up * Physics2D.gravity.y * (fallMultiplier - 1) * Time.deltaTime; } else if (rb2d.velocity.y > 0) { rb2d.velocity += Vector2.up * Physics2D.gravity.y * (lowJumpMultiplier - 1) * Time.deltaTime; } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Peanut Geschrieben 21. Mai 2019 Melden Share Geschrieben 21. Mai 2019 Könntest du das gesamte Script fürs Berechnen der Flugbahn posten? Ich weiß z.B, gerade ned woher dotSeparation und dotShift. Und was ich auch nicht was der z-Wert von dots[k].transform.position = new Vector3(x1, y1, dots[k].transform.position.z); machen soll Wenn ichs verstehe können wirs bestimmt zsm lösen Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Iboshido Geschrieben 22. Mai 2019 Autor Melden Share Geschrieben 22. Mai 2019 danke für deine Hilfe 😁 der gesamte code für die Flugbahn sieht wie folgt aus public class trajectoryScript : MonoBehaviour { private float dotShift; //set to 5. How far the first dot is from the "ball" private float dotSeparation; // set to 3. How far each dot is seperateted from each other private int numberOfDots; // set to 5. How many dots should be desplayed. Max 40. public GameObject trajectoryDots; //The parent of all the points representing the trajectory private GameObject ball; //The projectile the player will be shooting private Rigidbody2D ballRB; //The Rigidbody2D attached to the projectile the player will be shooting private Vector3 ballPos; //Position of the ball private Vector2 shotForce; //How much velocity will be applied to the ball private float x1, y1; //X and Y position which will be applied to each point of the trajectory public float shootingPowerX; //set to 12. The amount of power which can be applied in the X direction public float shootingPowerY; //set to 12. The amount of power which can be applied in the Y direction private GameObject[] dots; //The array of points that make up the trajectory public bool isInCannon = false; private Transform shootingDiraction; private Vector3 ballArrowDiff; private GameObject btn_shootBall; void Start() { if(gameObject.name == "Kanone") shootingDiraction = transform.parent.gameObject.transform.GetChild(0).gameObject.transform; else shootingDiraction = transform.GetChild(0).gameObject.transform; ball = GameObject.Find("Ball"); btn_shootBall = GameObject.Find("Canvas").transform.Find("btn_shootBall").gameObject; isInCannon = false; ballRB = ball.GetComponent<Rigidbody2D>(); if (trajectoryDots == null) Debug.Log("trajectoryDots is null"); dots = trajectoryDots.GetComponent<MaskScript>().dots; dotSeparation = trajectoryDots.GetComponent<MaskScript>().dotSeparation; numberOfDots = trajectoryDots.GetComponent<MaskScript>().numberOfDots; dotShift = trajectoryDots.GetComponent<MaskScript>().dotShift; } void Update() { if (ball != null) { ballPos = ball.transform.position; ballArrowDiff = shootingDiraction.transform.position - ballPos; shotForce = new Vector2(ballArrowDiff.x * shootingPowerX, ballArrowDiff.y * shootingPowerY); } if (isInCannon) { skr_ballShootControler.instance.isballReadyForshoot = true; ballRB.constraints = RigidbodyConstraints2D.FreezeAll; trajectoryDots.SetActive(true); //Display the trajectory btn_shootBall.SetActive(true); btn_shootBall.transform.position = Camera.main.WorldToScreenPoint(this.transform.position); for (int k = 0; k < numberOfDots; k++) { //Each point of the trajectory will be given its position x1 = ballPos.x + shotForce.x * Time.fixedDeltaTime * (dotSeparation * k + dotShift); //X position for each point is found y1 = ballPos.y + shotForce.y * Time.fixedDeltaTime * (dotSeparation * k + dotShift) - (-Physics2D.gravity.y / 2f * Time.fixedDeltaTime * Time.fixedDeltaTime * (dotSeparation * k + dotShift) * (dotSeparation * k + dotShift)); //Y position for each point is found dots[k].transform.position = new Vector3(x1, y1, dots[k].transform.position.z); //Position is applied to each point } if (skr_ballShootControler.instance.isShooting) // if ball is inside the cannon { isInCannon = false; skr_ballShootControler.instance.isShooting = false; btn_shootBall.SetActive(false); if (trajectoryDots.activeInHierarchy) { //If the player was aiming... ballRB.constraints = RigidbodyConstraints2D.None; trajectoryDots.SetActive(false); //The trajectory will hide ballRB.velocity = new Vector2(shotForce.x, shotForce.y); //The "ball" will have its new velocity if (ballRB.isKinematic == true) { //If the "ball" was kinematic... ballRB.isKinematic = false; //It's no longer kinematic } } } } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Peanut Geschrieben 23. Mai 2019 Melden Share Geschrieben 23. Mai 2019 Ich denke man muss nur diese Zeile anpassen(wie du ja selbst schon vermutet hast) : y1 = ballPos.y + shotForce.y * Time.fixedDeltaTime * (dotSeparation * k + dotShift) - (-Physics2D.gravity.y / 2f * Time.fixedDeltaTime * Time.fixedDeltaTime * (dotSeparation * k + dotShift) * ( Hast du die Zeile selber geschrieben? Weil Time.deltaTime*Time.deltaTime macht für mich irgendwie wie keinen Sinn :P(falls dus erklären kannst) Ich glaube du musst in der for Schleife mit einem If-Statement unterscheiden ob der Ball prositive rb2d.velocity.y hat oder eine negative und jenachdem welcher Fall eintritt du die yAxis der Dots anders berechnen musst. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Iboshido Geschrieben 3. Juni 2019 Autor Melden Share Geschrieben 3. Juni 2019 Ne hab den code nicht selber geschrieben, habe ihn aus dem Netz. Ich verstehe leider nicht ganz wie ich das, was du sagst umsetzen kann 😅 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Peanut Geschrieben 6. Juni 2019 Melden Share Geschrieben 6. Juni 2019 Dein Code for (int k = 0; k < numberOfDots; k++) { //Each point of the trajectory will be given its position x1 = ballPos.x + shotForce.x * Time.fixedDeltaTime * (dotSeparation * k + dotShift); //X position for each point is found y1 = ballPos.y + shotForce.y * Time.fixedDeltaTime * (dotSeparation * k + dotShift) - (-Physics2D.gravity.y / 2f * Time.fixedDeltaTime * Time.fixedDeltaTime * (dotSeparation * k + dotShift) * (dotSeparation * k + dotShift)); //Y position for each point is found dots[k].transform.position = new Vector3(x1, y1, dots[k].transform.position.z); //Position is applied to each point } /*Du musst bei y1 unterschieden ob rb2d.velocity.y < 0 oder rb2d.velocity.y > 0 ist weil es ist ja ein unterschied ob der Ball hoch oder runter fliegt Somit musst du das mit nem if Statement an der Stelle unterscheiden*/ for (int k = 0; k < numberOfDots; k++) { //Each point of the trajectory will be given its position x1 = ballPos.x + shotForce.x * Time.fixedDeltaTime * (dotSeparation * k + dotShift); //X position for each point is found if(rb2d.velocity.y < 0) { //y1 = berechnung für die flugbahn rb2d.velocity.y < 0 } if(rb2d.velocity.y > 0){ //y1 = berechnung für die flugbahn rb2d.velocity.y > 0 } dots[k].transform.position = new Vector3(x1, y1, dots[k].transform.position.z); //Position is applied to each point } Hoffe so ist es verständlicher :3 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.