球体上的Unity3D拖动对象
我正在努力让我的物体在球体上正常工作,我希望在这里能得到一些帮助 我想根据鼠标位置准确放置对象。这有点难以解释,但这里有一段视频展示了它目前的工作原理 如果有人给我指出了解决这个问题的正确方向,我将不胜感激 以下是我使用的脚本:球体上的Unity3D拖动对象,unity3d,geometry,draggable,Unity3d,Geometry,Draggable,我正在努力让我的物体在球体上正常工作,我希望在这里能得到一些帮助 我想根据鼠标位置准确放置对象。这有点难以解释,但这里有一段视频展示了它目前的工作原理 如果有人给我指出了解决这个问题的正确方向,我将不胜感激 以下是我使用的脚本: #pragma strict var myTransform : Transform; var target : Transform; var beingDragged : boolean; var distance : float; var targetPosit
#pragma strict
var myTransform : Transform;
var target : Transform;
var beingDragged : boolean;
var distance : float;
var targetPosition : Vector3;
var distanceToTarget : Vector3;
var placementPosition : Vector3;
var t : Matrix4x4;
var gameManager : GameObject;
var buildModeScript : BuildMode;
function Start ()
{
myTransform = transform;
gameManager = GameObject.FindGameObjectWithTag("gameManager");
buildModeScript = gameManager.GetComponent(BuildMode);
target = myTransform.parent;
}
function Update ()
{
if (buildModeScript.buildMode)
{
if (beingDragged)
{
DragMe();
}
}
}
function DragMe ()
{
var mouseX = -Input.mousePosition.x;
var mouseY = Input.mousePosition.y;
targetPosition = target.position;
distance = (target.localScale.x / 2) + 1;
//Calculate position on sphere
distanceToTarget = new Vector3(0, 0, -distance);
t = Matrix4x4.TRS(targetPosition, Quaternion.Euler(mouseY, mouseX, 0), Vector3.one);
placementPosition = t.MultiplyPoint(distanceToTarget);
//Put me there
myTransform.position = placementPosition;
myTransform.LookAt(target);
}
function OnMouseDown ()
{
beingDragged = true;
}
function OnMouseUp ()
{
beingDragged = false;
}
在我面前,我没有一个完整的工作示例,但是看看这是否能让你朝着正确的方向前进。如果你的球体上有一个对撞机,你可以使用
如果不想使用光线投射,可以获取世界位置并计算最近点。要获得世界排名,请参见。对于那些寻找类似产品的人,这里是我的新脚本:
#pragma strict
var myTransform : Transform;
var target : Transform;
var beingDragged : boolean;
var gameManager : GameObject;
var buildModeScript : BuildMode;
function Start ()
{
myTransform = transform;
gameManager = GameObject.FindGameObjectWithTag("gameManager");
buildModeScript = gameManager.GetComponent(BuildMode);
target = myTransform.parent;
}
function Update ()
{
if (beingDragged)
{
DragMe();
}
}
function DragMe ()
{
var ray = Camera.main.ScreenPointToRay (Input.mousePosition);
var hit : RaycastHit;
if (Physics.Raycast (ray, hit, 1000))
{
if (hit.transform == target)
{
myTransform.position = hit.point;
myTransform.LookAt(target);
}
}
}
function OnMouseDown ()
{
if (buildModeScript.buildMode)
{
if (beingDragged == true)
{
beingDragged = false;
}
else if (beingDragged == false)
{
beingDragged = true;
}
}
}
谢谢你的回答,我已经做了一些工作,我使它完美地满足了我的需要。非常感谢:)如果您对此感兴趣,这里有一个视频显示最终结果:
#pragma strict
var myTransform : Transform;
var target : Transform;
var beingDragged : boolean;
var gameManager : GameObject;
var buildModeScript : BuildMode;
function Start ()
{
myTransform = transform;
gameManager = GameObject.FindGameObjectWithTag("gameManager");
buildModeScript = gameManager.GetComponent(BuildMode);
target = myTransform.parent;
}
function Update ()
{
if (beingDragged)
{
DragMe();
}
}
function DragMe ()
{
var ray = Camera.main.ScreenPointToRay (Input.mousePosition);
var hit : RaycastHit;
if (Physics.Raycast (ray, hit, 1000))
{
if (hit.transform == target)
{
myTransform.position = hit.point;
myTransform.LookAt(target);
}
}
}
function OnMouseDown ()
{
if (buildModeScript.buildMode)
{
if (beingDragged == true)
{
beingDragged = false;
}
else if (beingDragged == false)
{
beingDragged = true;
}
}
}