Unity - получить локальную позицию мыши из центра игрового объекта

Я хочу, чтобы позиция мыши была нажата в центре игрового объекта, например, "Сфера масштаба" (1, 1, 1). Если я щелкну по центру сферы, он должен вернуть компонент x как ноль, при щелчке в крайнем левом углу сферы он должен вернуть -0.5 как компонент x вектора3 и 0.5 при щелчке по крайнему правому краю сферы., Приведенный ниже код помогает мне достичь этого, когда я в начале. Тем не менее, есть одно ограничение для этого. Сфера должна быть расположена в (0, что-нибудь, что-нибудь) (поскольку я касаюсь оси x). Любая помощь о том, как я могу достичь этого независимо от позиции сферы?

bool isGameOver = false;
float pointX;

// Update is called once per frame
void Update () {
    if(!isGameOver){
        RaycastHit hit;
        if(Input.GetMouseButtonDown(0)){
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            if(Physics.Raycast(ray, out hit)){
                if(hit.transform.tag =="Ball"){
                    pointX = transform.InverseTransformPoint(hit.point).x;
                }
            }
        }
    }
}

3 ответа

Вы используете перспективную камеру или ортографическую? Если вы используете перспективу и перемещаете игровой объект вправо, вы не можете попасть на 0,5 с правой стороны. Потому что вот ваша видимая часть шара. Только может сделать это с камерой Orto

Ваш код подходит для этого. Если вам нужна позиция объекта, нужно всего лишь добавить transform.localposition в ваш pointX.

pointX = transform.localPosition.x + transform.InverseTransformPoint(hit.point).x;

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

void Update () {
    if(!isGameOver)
    {
        Vector3 offset =  transform.position - Camera.main.transform.position;
        transform.LookAt(transform.position + offset);
        RaycastHit hit;
        if(Input.GetMouseButtonUp(0)){
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            if(Physics.Raycast(ray, out hit)){
                if(hit.transform.tag =="Ball")
                {

                    pointX = hit.transform.InverseTransformPoint(hit.point);
                    Debug.Log ("X:" + pointX.ToString());
                }
            }
        }
    }
}
Другие вопросы по тегам