Vector3.Distance для сравнения расстояния мыши и GameObject - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть некоторые данные для мыши, которые я преобразовал в Vector3. Теперь я использовал этот ввод и вычислил расстояние между входом мыши и позицией моих игровых объектов. Метод возвращает число с плавающей точкой в ​​качестве моего расстояния, которое я сравнил с моим значением с плавающей точкой MaxDistance. Поэтому, когда мое Inputdistance меньше или равно моему MaxDistance, оно должно уничтожить мой GameObject. Но когда я запускаю свою игру, ничего не работает. Я также пытался увеличить значение MaxDistance, но это тоже не помогло.

Вот мой код:

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

public class Tropfen : MonoBehaviour
{
public float speed = 10.0f;
Rigidbody2D rb;
AudioSource source;
[SerializeField] AudioClip[] soundClips;
[SerializeField] GameObject particleEffect;
[SerializeField] float maxDistance = 20f;

void Start()
{
    rb = GetComponent<Rigidbody2D>();
    rb.velocity = new Vector2(0, -speed * Time.deltaTime);
    source = GetComponent<AudioSource>();
    source.clip = soundClips[Random.Range(0, soundClips.Length)];
}

// Update is called once per frame
void Update()
{
    Vector3 screenPos = Input.mousePosition;
    Camera.main.ScreenToWorldPoint(screenPos);

    float TropfenTouchDistance = Vector3.Distance(screenPos, gameObject.transform.position);

    if ( TropfenTouchDistance <= maxDistance)
    {
        TropfenDestruction();
    }
}

private void TropfenDestruction()
{
    Destroy(gameObject);
    AudioSource.PlayClipAtPoint(source.clip, transform.position);
    GameObject effect = Instantiate(particleEffect, transform.position, Quaternion.identity) as 
    GameObject;
    Destroy(effect, 2f);
    FindObjectOfType<Gameplay>().IncreaseScore(1);
}
}

1 Ответ

0 голосов
/ 11 февраля 2020

Ваш screenPos по-прежнему находится в пиксельном пространстве экрана, поскольку вы не использовали вывод ScreenToWorldPoint

var screenPos = Input.mousePosition;
var worldPos = Camera.main.ScreenToWorldPoint(screenPos);

// It's redundant going through the gameObject here btw
var TropfenTouchDistance = Vector3.Distance(worldPos, transform.position);

if ( TropfenTouchDistance <= maxDistance)
{
    TropfenDestruction();
}

В любом случае, обратите внимание, что ScreenToWorldPoint* Для 1010 * также необходим компонент Z

Позиция на экране (часто мышь x, y), плюс позиция z для глубины (например, плоскость отсечения камеры) .

, указывающий, как далеко от заданной Camera точка должна быть спроецирована в мир.


Чтобы преодолеть это, вы можете использовать математическое Plane, чтобы вы могли получить точно спроецированную точку рядом с объектом, используя ScreenPointToRay в Plane.Raycast

// In general store the camera reference as Camera.main is very expensive!
[SerializeField] private Camera _camera;


private void Update()
{
    if(!_camera) _camera = Camera.main;

    var plane = new Plane(Camera.main.transform.forward, transform.position);
    var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    if(plane.Raycast(ray, out var hitDistance))
    {  
        var worldPoint = ray.GetPoint(hitDistance);
        var TropfenTouchDistance = Vector3.Distance(worldPos, transform.position);

        if ( TropfenTouchDistance <= maxDistance)
        {
            TropfenDestruction();
        }
    }
}
...