因此,我正在尝试制作一款游戏,要求您设置在特定平台上反弹才能到达目的地的球的角度和速度。
现在,我如何找到从手指触摸到球的方向,以使其“远离手指”移动。
我试图使用矢量的减法来获得方向,但由于矢量相对于世界原点而没有用...它总是给我一个错误的方向...
我该如何解决这个问题,我需要一个相对于触摸和玩家(球)而不是相对于世界的方向矢量,以便可以发射球。
您会看到在下一张图片中我正在用鼠标箭头模拟触摸(假设鼠标箭头是玩家的手指。我想根据手指相对于手指的距离和位置来发射球)仅当将球放置在场景的原点上时,它才在代码中有效,但是我认为这是向量的数学问题,我不知道如何解决...
下面是我现在拥有的代码。它附着在球的游戏对象上:
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);
}
}
答案 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);