Unity Object Position - PullRequest
       7

Unity Object Position

0 голосов
/ 13 октября 2018

Я обнаружил изъян в своем коде, я вижу, что отслеживается только моя первая позиция мяча, и когда я снова удару, мне нужно провести со стартовой позиции мячей.Как я могу это починить, чтобы после удара сдвинуть туда, где находится мяч?Спасибо!Код здесь:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SwipeUnlimited : MonoBehaviour 
{
    Rigidbody2D rbody;
    Vector2 startpos;
    Vector2 endpos;
    float power = 5f; // power of shot


    // Use this for initialization
    void Start() 
    {    
        rbody = GetComponent<Rigidbody2D>();    
    }

    // Update is called once per frame
    void Update() 
    {                
        if (Input.GetMouseButtonUp(0))
        {
            endpos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            LaunchBall();
        }
    }

    void OnMouseDown()
    {
        startpos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
    }

    void LaunchBall()
    {
        Vector2 direction = (startpos - endpos); // swap subtraction to switch direction of launch
        rbody.AddForce(direction * power, ForceMode2D.Impulse);
    }
}

1 Ответ

0 голосов
/ 13 октября 2018

OnMouseDown вызывается только в том случае, если указатель находится над коллайдером, а GetMouseButtonUp вызывается глобально независимо от коллайдера.Это означает, что вы можете вызвать LaunchBall() с неправильными координатами, потому что startpos может быть установлен неправильно.

Просто подозрение, но у вас может даже не быть коллайдера и OnMouseDown, вызываемых вообще, но начинающихся с 0,0,0 это значение по умолчанию для startpos, если оно не установлено на другое значение.

Так что вам кажется, что вам всегда приходилось начинать считывание с первого startpose, но startpose может на самом деленикогда не меняются вообще.

Чтобы избежать этого, я бы использовал простой флаг isLaunching.

Кроме того, я бы не стал использовать Update, а скорее OnMouseUp.В отличие от OnMouseDown, OnMouseUp вызывается, даже если мышь не находится над коллайдером, поэтому в основном она делает то же самое, но без повторного запуска метода Update.

bool isLaunching;

 // instead of your Update
void OnMouseUp() 
{
    // makes sure you can only launch after updating startpos
    if(!isLaunching) return;

    endpos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
    LaunchBall();
    isLaunching = false;
}

void OnMouseDown()
{
    startpos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
    isLaunching = true;
}

Если сейчас ничего не происходит, чемвы знаете, что OnMouseDown вообще не вызывается, и вам может не хватать коллайдера.

...