Мощность прогнозирования траектории Gold2d - PullRequest
0 голосов
/ 03 апреля 2020

Я хотел бы добавить силу к своему мячу в моей игре в гольф, поэтому, если игрок щелкает мяч и удерживает левую кнопку мыши, сила удара увеличивается, как и траектория. Когда мощность достигает максимального значения, мяч сразу же выстреливается. У меня огромная проблема, и я застрял на ней несколько дней. Может быть, кто-то может мне помочь? Код ниже:

 internal Rigidbody2D ballRB;
 internal Vector3 startPos = Vector3.zero;

 int dotCount;

 internal bool isClicked = false;
 bool trajectoryVisible = false;
 bool paraboleReachedEndOfScreen = true;

 GameObject trajectoryDots;
 GameObject ballClick;

 //TrajectoryDots
 List<Transform> dots = new List<Transform>();

 //shot velocity
 Vector2 shotForce = Vector2.zero;

 public float startValShootingPower = 3f;
 public float shootingPower = 3f;


 float minBallPointerDist = 0.5f;

 float dotSeparation = 10f;

 float dotShift = 5f;

 Transform lastDotTransform;

 void Start()
 {
     startPos = transform.position;
     startValShootingPower = shootingPower;

     ballRB = GetComponent<Rigidbody2D>();
     trajectoryDots = GameObject.Find("Trajectory Dots");
     ballClick = transform.Find("Ball Click Area").gameObject;

     dotCount = trajectoryDots.transform.childCount;
     foreach (var dot in trajectoryDots.GetComponentsInChildren<Transform>())
     {
         dots.Add(dot);
     }
     dots.Remove(trajectoryDots.transform);
 }

 void Update()
 {
     foreach (var dot in dots)
     {
         if (dot.GetComponent<SpriteRenderer>().enabled)
         {
             lastDotTransform = dot;
         }
     }
     paraboleReachedEndOfScreen = lastDotTransform.position.x <= -UsefulReferences.CameraViewFrustum.x / 2 || lastDotTransform.position.x >= UsefulReferences.CameraViewFrustum.x / 2;

     ballClick.SetActive(!isClicked);

     RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);
     if (Input.GetButtonDown("Fire1"))
     {
         if (hit.collider != null)
         {
             //check if the mouse is hovering ball click area
             if (hit.collider.transform.root.name == name)
             {
                 trajectoryVisible = true;
             }
         }
     }

     if ((Input.GetButtonUp("Fire1") || (paraboleReachedEndOfScreen && Input.GetButton("Fire1"))) && !isClicked && trajectoryVisible) //player released the mouse button or the parabole reached the end of the screen
     {
         trajectoryVisible = false;
         isClicked = true;
         UsefulReferences.ballScript.ballRB.constraints = RigidbodyConstraints2D.FreezeRotation;
         ballRB.velocity = shotForce;
         foreach (var dot in dots)
             dot.transform.position = Vector3.zero;
         Invoke("GroundCheckAfterShot", 0.1f);
     }

     if (trajectoryVisible && !isClicked)
     {
         shotForce = (transform.position - Camera.main.ScreenToWorldPoint(Input.mousePosition)) * shootingPower;
         for (int i = 0; i < dotCount; i++) 
         {
             dots[i].gameObject.SetActive(true);

             dots[i].transform.position = new Vector2(transform.position.x + shotForce.x * Time.fixedDeltaTime * (dotSeparation * i + dotShift),
                 transform.position.y + shotForce.y * Time.fixedDeltaTime * (dotSeparation * i + dotShift) - (-Physics2D.gravity.y / 2f * Time.fixedDeltaTime * Time.fixedDeltaTime * (dotSeparation * i + dotShift) * (dotSeparation * i + dotShift)));
         }
     }
     else
     {
         foreach (var dot in dots)
         {
             dot.gameObject.SetActive(false);
         }
     }
     //if the ball tried to fly out of the screen
     if (transform.position.y > UsefulReferences.CameraViewFrustum.y / 2 || transform.position.x > UsefulReferences.CameraViewFrustum.x / 2 || transform.position.x < -UsefulReferences.CameraViewFrustum.x / 2)
     {
         OnCollisionEnter2D(null);
     }


     if (isClicked && UsefulReferences.ballScript.ballRB.constraints == RigidbodyConstraints2D.FreezeAll)
     {
         UsefulReferences.gcsScript.gameOver = true;
     }
 }

 void OnTriggerEnter2D(Collider2D collision)
 {
     if (collision.tag == "Hole")
     {
         UsefulReferences.gcsScript.Score();
         ballRB.constraints = RigidbodyConstraints2D.FreezeAll;
     }
 }

 void OnCollisionEnter2D(Collision2D collision)
 {
     ballRB.constraints = RigidbodyConstraints2D.FreezeAll;
 }

 void GroundCheckAfterShot()
 {
     if (transform.position.y - startPos.y < 0.05f)
         ballRB.constraints = RigidbodyConstraints2D.FreezeAll;
 }

}

...