Как я могу запустить мяч в зависимости от положения касания на экране? - PullRequest
0 голосов
/ 30 ноября 2018

Итак, я пытаюсь создать игру, в которой вы должны установить угол и скорость мяча, который должен отражаться на определенных платформах, чтобы добраться до места назначения.

Теперь, как мне это сделать?найдите направление от точки касания пальца к мячу, чтобы заставить его двигаться «подальше от пальца».

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

Как мне решить эту проблему, мне нужен вектор направления относительно касания и игрока (мяча), а не мира, чтобы я мог запустить мяч.

Вы увидите это в следующемpicture Я имитирую прикосновение стрелкой мыши (скажем, стрелка мыши - палец игрока. Я хочу запустить мяч в зависимости от расстояния и положения пальца относительно мяча. Это хорошо работает в коде НОТОЛЬКО если мяч находится в начале сцены, так что я думаю, что это математическая проблема с векторами, которые я не знаю, как решить ...

Game

Ниже приведен код, который у меня есть. Он прикреплен к игровому объекту шара:

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

public class PlayerController : MonoBehaviour {

    [SerializeField]
    Camera playerCamera;
    Rigidbody rb;
    Vector3 touchPostion;

    private void Awake()
    {
        rb = GetComponent<Rigidbody>();
    }
    private void FixedUpdate()
    {
        if (Input.GetMouseButton(0))
        {
            LounchPlayer();
        }
    }

    void LounchPlayer()
    {
        Vector2 mousePos = Input.mousePosition;
        touchPostion = (transform.position - playerCamera.ScreenToWorldPoint(
                                            new Vector3(mousePos.x, 
                                                       mousePos.y, 
                                                       playerCamera.transform.position.z))).normalized;
        rb.AddForce(touchPostion.normalized, ForceMode.Impulse);
    }
}

1 Ответ

0 голосов
/ 30 ноября 2018

При нахождении вашей позиции касания компонент z параметра ScreenToWorldPoint должен находиться на соответствующем расстоянии вдоль вектора вперед камеры, а не на мировой позиции z камеры.playerCamera.nearClipPlane здесь уместно, но на самом деле подойдет любая маленькая константа (например, 0).

Кроме того, нет необходимости дважды нормализовать направление запуска.

Vector2 mousePos = Input.mousePosition;
touchPostion = (transform.position - playerCamera.ScreenToWorldPoint(
        new Vector3(
            mousePos.x, 
            mousePos.y, 
            playerCamera.nearClipPlane))
        ).normalized;  // This isn't a position vector; it's a direction vector. 
                       // The var name "touchPosition" is misleading and should be changed.

float launchMagnitude = 1f; // change this to adjust the power of the launch

rb.AddForce(touchPostion * launchMagnitude , ForceMode.Impulse);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...