3
var startPoint = 
  shaft.transform.position 
  + shaft.transform.forward;
var ray = new Ray(
    startPoint, 
    -shaft.transform.forward
  );

RaycastHit rayCastHit;
Physics.Raycast(ray, out rayCastHit);
var textured2D = (Texture2D)discoBall.renderer.material.mainTexture;
Vector2 textureCoord = rayCastHit.textureCoord;
Debug.Log(string.Format(
    "{0},{1} at distance {2}", 
    textureCoord.x * textured2D.width, 
    textureCoord.y * textured2D.height, 
    rayCastHit.distance
  ));

我有一个球体,里面有一个对象“轴”对象。我将 startPoint 计算为在轴指向的方向上与轴的距离(以离开球体)。然后我创建一条以相同距离指向球体的射线,使其与我的球体外部发生碰撞。

Debug.Log 输出纹理坐标的 x,y = 0,0,距离的正确值 0.35。当我的球体上确实有一个带有纹理的材质时,为什么 textureCoord 总是 0,0?

球体属性

4

2 回答 2

5

实际上让我在这里移动我的评论,球体使用网格对撞机还是球体对撞机?如果它不使用网格碰撞器,textureCoord 返回 Vector2.zero

更新

要更改 GameObject 的碰撞器类型,请在 Unity 编辑器中突出显示它,然后转到Component->Physics->MeshCollider。如果提示“替换现有组件”,请选择“替换”。

从 Unity 的GameObject->Create_Other菜单添加的游戏对象往往会根据对象的形状(球体、盒子等)默认使用碰撞器,因为网格碰撞器的计算成本更高。

于 2013-02-23T21:57:40.183 回答
1

texture2d 的宽度和高度实际上是您所期望的吗?可能 maintexture 不是您正在使用的着色器上的正确纹理。

于 2013-02-23T21:56:03.453 回答