如何根据屏幕上的触摸位置发射球?

时间:2018-11-30 15:49:10

标签: c# unity3d

因此,我正在尝试制作一款游戏,要求您设置在特定平台上反弹才能到达目的地的球的角度和速度。

现在,我如何找到从手指触摸到球的方向,以使其“远离手指”移动。

我试图使用矢量的减法来获得方向,但由于矢量相对于世界原点而没有用...它总是给我一个错误的方向...

我该如何解决这个问题,我需要一个相对于触摸和玩家(球)而不是相对于世界的方向矢量,以便可以发射球。

您会看到在下一张图片中我正在用鼠标箭头模拟触摸(假设鼠标箭头是玩家的手指。我想根据手指相对于手指的距离和位置来发射球)仅当将球放置在场景的原点上时,它才在代码中有效,但是我认为这是向量的数学问题,我不知道如何解决...

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 :(得分:1)

找到触摸位置时,ScreenToWorldPoint的参数的z分量应沿着相机的前向矢量保持适当的距离,绝对不是相机的世界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);