如何通过用鼠标拖动来缩放对象?
How do I make an object scale by dragging it with a mouse?
我一直在搜索整个 Google,但我无法在任何地方找到解决方案。基本上我正在寻找的是我有一个立方体对象和一个箭头对象,我想通过用鼠标拖动箭头对象来调整立方体对象的大小。
我已经尝试了几乎所有我能找到的部分解决方案,但都无济于事。
private GameObject mainObject;
private float positionZ = 5.0f;
public float sizingFactor = 0.03f;
private float startSize;
private float startX;
private float startY;
private float startZ;
// Use this for initialization
void Start()
{
mainObject = GameObject.Find("Cube");
}
// Use this when user has clicked on object and still holding it
void OnMouseDrag()
{
//When user has left clicked
if (Input.GetMouseButton(0))
{
//Move the blue box by mouse
Vector3 positionRight = mainObject.transform.position;
Vector3 mousePosition = new Vector3(Input.mousePosition.x,
Input.mousePosition.y, Input.mousePosition.z);
startX = mousePosition.x;
startY = mousePosition.y;
startZ = mousePosition.z;
Vector3 objPosition =
Camera.main.ScreenToWorldPoint(mousePosition);
//Set the blue box by x axis of mouse and y,z axises of empty-
object right one
transform.position = new Vector3(objPosition.x, objPosition.y,
enter code hereobjPosition.z);
startSize = mainObject.transform.localScale.x;
}
if (Input.GetMouseButton(0))
{
//Scale green box by blue box
Vector3 scale = mainObject.transform.localScale;
scale.x = startSize + (Input.mousePosition.x - startX) *
sizingFactor;
Debug.Log(scale.x);
scale.y = startSize + (Input.mousePosition.y - startY) *
sizingFactor;
scale.z = startSize + (Input.mousePosition.z - startZ) *
sizingFactor;
Debug.Log(scale.z);
mainObject.transform.localScale = scale;
}
}
void OnMouseUp()
{
}
这是我发现并尝试修改的东西,但无济于事。
任何帮助将不胜感激。
编辑:
Vector2 prevMousePosition;
private GameObject mainObject;
public float sizingFactor = 0.03f;
Vector3 minimumScale;
private void Start()
{
mainObject = GameObject.Find("Cube");
minimumScale = new Vector3(1.0f, 1.0f, 1.0f);
}
void OnMouseDrag()
{
Vector2 mousePosition = Input.mousePosition;
if (Input.GetMouseButton(0))
{
transform.position = Camera.main.ScreenToWorldPoint(mousePosition);
Vector3 scale = mainObject.transform.localScale;
scale.x = scale.x + (mousePosition.x - prevMousePosition.x) * sizingFactor;
scale.y = scale.x;
scale.z = scale.x;
mainObject.transform.localScale = scale;
if (scale.x < minimumScale.x)
{
mainObject.transform.localScale = minimumScale;
}
}
prevMousePosition = mousePosition;
}
这现在适用于所有轴。但是,似乎有一个错误导致立方体在所有 3 个轴上放大到 10。
而当代码为:scale.x - (mousePositon.x - prevMousePosition.x) * sizingFactor
立方体从 1.0f 开始正常工作和缩放。
我认为您走在正确的轨道上 - 您只是稍微误解了更新循环。在一个 OnMouseDrag 回调中,您的代码看起来像是在尝试查看鼠标位置之间的差异,但它们的值相同:
问题
startX = mousePosition.x;
// [...]
scale.x = startSize + (Input.mousePosition.x - startX) * sizingFactor;
这会产生 startSize + (x - x) * y
,与 startSize + 0
相同,当然与 startSize
相同,意思是没有变化。
解决方案
你需要在帧之间区分mousePosition,意思是在OnMouseDrag()
个回调之间:
Vector2 prevMousePosition;
void OnMouseDrag()
{
Vector2 mousePosition = Input.mousePosition;
if (Input.GetMouseButton(0))
{
transform.position = Camera.main.ScreenToWorldPoint(mousePosition);
Vector3 scale = mainObject.transform.localScale;
scale.x = scale.x * (mousePosition.x - prevMousePosition.x) * sizingFactor;
scale.y = scale.y * (mousePosition.y - prevMousePosition.y) * sizingFactor;
mainObject.transform.localScale = scale;
}
prevMousePosition = mousePosition;
}
基本上,这段代码做了两件事:
- 将此对象的位置设置为您按住左键单击的位置(我保留了原来的代码,但将其减少为 1 行代码,
- 通过比较前一帧的 mousePosition 与本帧的位置来改变 mainObject 的比例,由 sizingFactor 修改。
在您的代码中,您还试图管理鼠标在 z 轴上移动的时间。我不知道你打算如何在三维平面上移动鼠标,我不知道 - 所以我删除了它:)
我也借此机会使代码尽可能简单易读。如果我删除了一些需要的东西,我深表歉意,但我认为大部分代码行都已过时。
我没有尝试过这段代码,如果它没有按预期编译或工作,请告诉我。
我一直在搜索整个 Google,但我无法在任何地方找到解决方案。基本上我正在寻找的是我有一个立方体对象和一个箭头对象,我想通过用鼠标拖动箭头对象来调整立方体对象的大小。
我已经尝试了几乎所有我能找到的部分解决方案,但都无济于事。
private GameObject mainObject;
private float positionZ = 5.0f;
public float sizingFactor = 0.03f;
private float startSize;
private float startX;
private float startY;
private float startZ;
// Use this for initialization
void Start()
{
mainObject = GameObject.Find("Cube");
}
// Use this when user has clicked on object and still holding it
void OnMouseDrag()
{
//When user has left clicked
if (Input.GetMouseButton(0))
{
//Move the blue box by mouse
Vector3 positionRight = mainObject.transform.position;
Vector3 mousePosition = new Vector3(Input.mousePosition.x,
Input.mousePosition.y, Input.mousePosition.z);
startX = mousePosition.x;
startY = mousePosition.y;
startZ = mousePosition.z;
Vector3 objPosition =
Camera.main.ScreenToWorldPoint(mousePosition);
//Set the blue box by x axis of mouse and y,z axises of empty-
object right one
transform.position = new Vector3(objPosition.x, objPosition.y,
enter code hereobjPosition.z);
startSize = mainObject.transform.localScale.x;
}
if (Input.GetMouseButton(0))
{
//Scale green box by blue box
Vector3 scale = mainObject.transform.localScale;
scale.x = startSize + (Input.mousePosition.x - startX) *
sizingFactor;
Debug.Log(scale.x);
scale.y = startSize + (Input.mousePosition.y - startY) *
sizingFactor;
scale.z = startSize + (Input.mousePosition.z - startZ) *
sizingFactor;
Debug.Log(scale.z);
mainObject.transform.localScale = scale;
}
}
void OnMouseUp()
{
}
这是我发现并尝试修改的东西,但无济于事。 任何帮助将不胜感激。
编辑:
Vector2 prevMousePosition;
private GameObject mainObject;
public float sizingFactor = 0.03f;
Vector3 minimumScale;
private void Start()
{
mainObject = GameObject.Find("Cube");
minimumScale = new Vector3(1.0f, 1.0f, 1.0f);
}
void OnMouseDrag()
{
Vector2 mousePosition = Input.mousePosition;
if (Input.GetMouseButton(0))
{
transform.position = Camera.main.ScreenToWorldPoint(mousePosition);
Vector3 scale = mainObject.transform.localScale;
scale.x = scale.x + (mousePosition.x - prevMousePosition.x) * sizingFactor;
scale.y = scale.x;
scale.z = scale.x;
mainObject.transform.localScale = scale;
if (scale.x < minimumScale.x)
{
mainObject.transform.localScale = minimumScale;
}
}
prevMousePosition = mousePosition;
}
这现在适用于所有轴。但是,似乎有一个错误导致立方体在所有 3 个轴上放大到 10。
而当代码为:scale.x - (mousePositon.x - prevMousePosition.x) * sizingFactor
立方体从 1.0f 开始正常工作和缩放。
我认为您走在正确的轨道上 - 您只是稍微误解了更新循环。在一个 OnMouseDrag 回调中,您的代码看起来像是在尝试查看鼠标位置之间的差异,但它们的值相同:
问题
startX = mousePosition.x;
// [...]
scale.x = startSize + (Input.mousePosition.x - startX) * sizingFactor;
这会产生 startSize + (x - x) * y
,与 startSize + 0
相同,当然与 startSize
相同,意思是没有变化。
解决方案
你需要在帧之间区分mousePosition,意思是在OnMouseDrag()
个回调之间:
Vector2 prevMousePosition;
void OnMouseDrag()
{
Vector2 mousePosition = Input.mousePosition;
if (Input.GetMouseButton(0))
{
transform.position = Camera.main.ScreenToWorldPoint(mousePosition);
Vector3 scale = mainObject.transform.localScale;
scale.x = scale.x * (mousePosition.x - prevMousePosition.x) * sizingFactor;
scale.y = scale.y * (mousePosition.y - prevMousePosition.y) * sizingFactor;
mainObject.transform.localScale = scale;
}
prevMousePosition = mousePosition;
}
基本上,这段代码做了两件事:
- 将此对象的位置设置为您按住左键单击的位置(我保留了原来的代码,但将其减少为 1 行代码,
- 通过比较前一帧的 mousePosition 与本帧的位置来改变 mainObject 的比例,由 sizingFactor 修改。
在您的代码中,您还试图管理鼠标在 z 轴上移动的时间。我不知道你打算如何在三维平面上移动鼠标,我不知道 - 所以我删除了它:)
我也借此机会使代码尽可能简单易读。如果我删除了一些需要的东西,我深表歉意,但我认为大部分代码行都已过时。
我没有尝试过这段代码,如果它没有按预期编译或工作,请告诉我。