Создать экземпляр объекта на Raycast2D, ударить и повернуть экземпляр

Я хочу переместить экземпляр игрового объекта по контуру другого игрового объекта. Это 2D-проект в Unity.

Мой текущий код:

Vector3 mousePosition = m_camera.ScreenToWorldPoint(Input.mousePosition);
    RaycastHit2D hit = Physics2D.Raycast(new Vector2(mousePosition.x, mousePosition.y), new Vector2(player.transform.position.x, player.transform.position.y));
    if (hit.collider != null &&  hit.collider.gameObject.tag == "Player") {
        if (!pointerInstance) {
            pointerInstance = Instantiate(ghostPointer, new Vector3(hit.point.x, hit.point.y, -1.1f), Quaternion.identity);
        } else if(pointerInstance) {
            pointerInstance.gameObject.transform.position = new Vector3(hit.point.x, hit.point.y, -1.1f);
            pointerInstance.gameObject.transform.eulerAngles = new Vector3(0f, 0f, hit.normal.x);
        }

    }

К сожалению, gameObject не поворачивается к мыши, и позиция с левой стороны playerObject также иногда не работает. Я пытался использовать Instantiate() с Quaternion.LookRotation(hit.normal), но тоже не повезло.

Вот грубый набросок того, чего я хочу достичь: экземпляр дерева показан на поверхности игрока, обращенного к указателю мыши

Любая помощь приветствуется. Спасибо!


person Apfelbox    schedule 22.04.2017    source источник


Ответы (1)


лучше использовать математический способ, а не физический (Raycasting), потому что при raycasting вам нужно несколько раз бросать луч для проверки точки попадания и вращать ваш объект, это вызывает отставание в вашей игре.

Прикрепите этот скрипт к созданному вами объекту:

using UnityEngine;
using System.Collections;

public class Example : MonoBehaviour
{
    public Transform Player;

    void Update()
    {
        //Rotating Around Circle(circular movement depend on mouse position)
        Vector3 targetScreenPos = Camera.main.WorldToScreenPoint(Player.position);
        targetScreenPos.z = 0;//filtering target axis
        Vector3 targetToMouseDir = Input.mousePosition - targetScreenPos;

        Vector3 targetToMe = transform.position - Player.position;

        targetToMe.z = 0;//filtering targetToMe axis

        Vector3 newTargetToMe = Vector3.RotateTowards(targetToMe, targetToMouseDir,  /* max radians to turn this frame */ 2, 0);

        transform.position = Player.position +  /*distance from target center to stay at*/newTargetToMe.normalized;


        //Look At Mouse position
        var objectPos = Camera.main.WorldToScreenPoint(transform.position);
        var dir = Input.mousePosition - objectPos;
        transform.rotation = Quaternion.Euler(0, 0, Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg);

    }
}

Полезные пояснения

Атан2:

atan2(y,x) дает вам угол между осью x и вектором (x,y), обычно в радианах и со знаком, таким образом, что для положительного y вы получаете угол между 0 и π, а для отрицательного y результат между −π и 0. использовать-atan2


Возвращает угол в радианах, для которого Tan равен y/x. Возвращаемое значение — это угол между осью X и двумерным вектором, начинающимся с нуля и заканчивающимся в (x, y). https://docs.unity3d.com/ScriptReference/Mathf.Atan2.html

Mathf.Rad2Deg:

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

Это равно 360/(PI * 2).

person Seyed Morteza Kamali    schedule 23.04.2017