1

我想沿着另一个游戏对象的轮廓移动一个游戏对象的实例。它是 Unity 中的 2D 项目。

我目前的代码:

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) 一起使用,但也没有运气。

这是我想要实现的粗略草图: 树的实例显示在面向鼠标指针的玩家表面上

任何帮助表示赞赏。谢谢!

4

1 回答 1

1

最好使用数学方式而不是物理方式(射线投射),因为在射线投射中,您必须多次投掷射线来检查命中点并旋转您的对象,这会使您的游戏滞后。

将此脚本附加到您的实例化对象:

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 之间。 https://math.stackexchange.com/questions/67026/how-to-use-atan2


返回以弧度表示的角度,其 Tan 为 y/x。返回值是 x 轴与 2D 向量之间的角度,该向量从零开始并终止于 (x,y)。 https://docs.unity3d.com/ScriptReference/Mathf.Atan2.html

Mathf.Rad2Deg:

弧度到度数的转换常数(只读)。

这等于 360 / (PI * 2)。

于 2017-04-23T06:28:00.350 回答