首页 >Unity3D频道 >【Unity杂文】 > Unity3D研究院之获取BoxCollider八个点的世界坐标
2016
07-20

Unity3D研究院之获取BoxCollider八个点的世界坐标

我们想把场景中的BoxCollider的坐标点导出出来让服务器也能用。虽然BoxCollider自身的大小可以获取出来,但是如果有父对象,并且有坐标的变化那算起来就比较麻烦了。还好unity提供了一个方法,真的很便捷。如下图所示,我用了8个标记点来标记获取到的boxcollider的坐标。旋转、缩放都可以计算出正确的坐标点来。

Snip20160720_7

using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour 
{
    //8个标志位 ,用来在scene里预览
    public Transform[] points;
    //需要提取Boxcollier顶点的对象
    public BoxCollider cube;


    void Start()
    {
        //父节只能调节位置, 不能调节旋转和缩放。
        Transform parent = cube.transform.parent;
        while(parent!=null)
        {
            parent.localRotation = Quaternion.Euler(Vector3.zero);
            parent.localScale = Vector3.one;
            parent = parent.parent;
        }
    }

    void Update()
    {
        Vector3 [] veces = GetBoxColliderVertexPositions(cube);
        for(int i =0; i< veces.Length; i++)
        {
            points[i].transform.position = veces[i];
        }
    }

    Vector3[] GetBoxColliderVertexPositions (BoxCollider boxcollider) 
    {
        var vertices = new Vector3[8];
        //下面4个点
        vertices[0] = boxcollider.transform.TransformPoint(boxcollider.center + new Vector3(boxcollider.size.x, -boxcollider.size.y, boxcollider.size.z) * 0.5f);
        vertices[1] = boxcollider.transform.TransformPoint( boxcollider.center + new Vector3(-boxcollider.size.x, -boxcollider.size.y, boxcollider.size.z) * 0.5f);
        vertices[2] = boxcollider.transform.TransformPoint( boxcollider.center + new Vector3(-boxcollider.size.x, -boxcollider.size.y, -boxcollider.size.z) * 0.5f);
        vertices[3] = boxcollider.transform.TransformPoint(boxcollider.center + new Vector3(boxcollider.size.x, -boxcollider.size.y, -boxcollider.size.z) * 0.5f);
        //上面4个点
        vertices[4] = boxcollider.transform.TransformPoint(boxcollider.center + new Vector3(boxcollider.size.x, boxcollider.size.y, boxcollider.size.z) * 0.5f);
        vertices[5] = boxcollider.transform.TransformPoint( boxcollider.center + new Vector3(-boxcollider.size.x, boxcollider.size.y, boxcollider.size.z) * 0.5f);
        vertices[6] = boxcollider.transform.TransformPoint( boxcollider.center + new Vector3(-boxcollider.size.x, boxcollider.size.y, -boxcollider.size.z) * 0.5f);
        vertices[7] = boxcollider.transform.TransformPoint(boxcollider.center + new Vector3(boxcollider.size.x, boxcollider.size.y, -boxcollider.size.z) * 0.5f);

        return vertices;
    }
}

 

最后,欢迎大家测试~ 欢迎在下面给我留言~

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!

Unity3D研究院之获取BoxCollider八个点的世界坐标》有 14 条评论

  1. 123说:

    扩展 boxcollider 给他设置一个唯一的别名 怎么弄呀.

  2. sool说:

    CharacterController和其他碰撞体碰撞后CharacterController.collisionflags很奇怪有些情况是等于4有些情况等于5

  3. 月帆说:

    雨神,你好我在用射线拾取物体的纹理坐标时,RaycastHit hit; Physics.Raycast (camera.ScreenPointToRay(Input.mousePosition), hit);发现hit的其他值正常,而获取uv纹理坐标 Vector2 pixelUV = hit.textureCoord; 的值一直都是(0,0)

    • 月帆说:

      在使用hit.textureCoord时,有没有什么需要特别注意的地方?例如 mesh Colider 和 mesh Renderer 怎么设置图片格式要求还是少了什么前置的条件?在网上查了很久,关于 .textureCoord 的说明感觉很少

  4. = =说:

    大神你好,请问下在unity 怎么在真机调试c#脚本呀?我用网上那个方法,在player setting里面沟选debug script,然后生成xcode工程,app运行到真机上然后打开monodevelop ,attach to process界面可以看到正在运行程序的机器,可点击attach的时候总是提示could not connect to the debugger..

留下一个回复

你的email不会被公开。 必填项已用 * 标注。