Unity引擎中的一些常用方法

时间:2021-09-07 08:15:31

Unity引擎中的一些常用方法

发射射线

从任意GameObject或者屏幕上鼠标位置发射。

void Update()
{
    // 点击鼠标左键时发射射线
    if (Input.GetMouseButtonDown(0))
    {
        // 从鼠标所在的位置发射
        //Camera currentCamera = Camera.main;
        //Vector2 screenPosition = Input.mousePosition; 
        //Ray ray = currentCamera.ScreenPointToRay(screenPosition);

        // 从物体发射射线,替换成自己的GameObject的transform
        Ray ray = new Ray(transform.position, transform.forward);  

        RaycastHit hit;
        if (Physics.Raycast(ray, out hit))
        {
            print(hit.transform.name);
        }
    }
}

旋转Vector3

计算一个Vector3绕旋转中心旋转指定角度后所得到的向量:

/// <summary>
/// 计算一个Vector3绕旋转中心旋转指定角度后所得到的向量。
/// </summary>
/// <param name="source">旋转前的源Vector3</param>
/// <param name="axis">旋转轴</param>
/// <param name="angle">旋转角度</param>
/// <returns>旋转后得到的新Vector3</returns>
public Vector3 V3RotateAround(Vector3 source, Vector3 axis, float angle)
{
    Quaternion q = Quaternion.AngleAxis(angle, axis);// 旋转系数
    return q * source;// 返回目标点
}

旋转Quaternion

下面的方法可以获得GameObject绕指定轴旋转给定角度后的rotation,其返回值是一个四元数。注意该方法只计算原地旋转,即绕GameObject自身锚点旋转,不能设置其他旋转中心。

    /// <summary>
    /// 获得GameObject绕轴 axis 旋转 angle 角度后的rotation。
    /// </summary>
    /// <param name="obj">旋转对象</param>
    /// <param name="axis">旋转轴</param>
    /// <param name="angle">旋转角度</param>
    /// <param name="apply">是否将旋转应用到GameObject</param>
    /// <returns>旋转后的rotation</returns>
    public Quaternion QRotateAround(Transform obj, Vector3 axis, float angle, bool apply = false)
    {
        Vector3 forward = Quaternion.AngleAxis(angle, axis) * obj.forward;
        Vector3 up = Quaternion.AngleAxis(angle, axis) * obj.up;
        Quaternion result = Quaternion.LookRotation(forward, up);

        if (apply) obj.rotation = result;

        return result;
    }