turns-00005.parquet:55696
da77c9927cfe084095624aa8
turn 3/3gpt-3.5-turbo-0301EnglishUnited States324 words
degenerate_repetitionAbsentFinal dense release
USER
将上述代码修改需求,通过点击拖拽坐标轴来带动被点击模型零件进行x、y、z方向上的位移
ASSISTANT
以下是修改后的代码:
```csharp
using UnityEngine;
using cakeslice;
public class MoxingControl : MonoBehaviour
{
private Transform selectedPart = null;
private Outline outline = null;
private GameObject axis;
private Vector3 axisOffset = Vector3.zero;
private Vector3 mouseOffset = Vector3.zero;
private bool isControlEnabled = false;
private Color selectedColor = Color.yellow;
private Animator animator;
private bool animatorEnabled = true;
public GameObject axisPrefab;
private void Start()
{
axis = Instantiate(axisPrefab, Vector3.zero, Quaternion.identity);
axis.SetActive(false);
}
private void Update()
{
animator = GetComponent<Animator>();
if (!isControlEnabled)
return;
if (Input.GetMouseButtonDown(0))
{
Transform clickedPart = GetClickedPart(transform);
if (clickedPart != null)
{
if (selectedPart != null)
{
Destroy(outline);
}
selectedPart = clickedPart;
outline = selectedPart.gameObject.AddComponent<Outline>();
//outline.OutlineColor = selectedColor;
//outline.OutlineWidth = 2;
axis.SetActive(true);
axis.transform.SetParent(transform);
axis.transform.position = selectedPart.position;
axisOffset = axis.transform.position - selectedPart.position;
mouseOffset = selectedPart.position - Camera.main.ScreenToWorldPoint(Input.mousePosition);
}
else
{
if (selectedPart != null)
{
Destroy(outline);
selectedPart = null;
axis.SetActive(false);
}
}
}
if (Input.GetMouseButton(0) && selectedPart != null)
{
Vector3 mousePosition = Input.mousePosition;
mousePosition.z = axisOffset.z;
Vector3 worldMousePosition = Camera.main.ScreenToWorldPoint(mousePosition) + mouseOffset;
Vector3 localPosition = axis.transform.InverseTransformPoint(worldMousePosition) - axisOffset;
float xOffset = Mathf.Round(localPosition.x * 1000) / 1000f;
float yOffset = Mathf.Round(localPosition.y * 1000) / 1000f;
float zOffset = Mathf.Round(localPosition.z * 1000) / 1000f;
selectedPart.position += new Vector3(xOffset, yOffset, zOffset);
}
if (selectedPart != null)
{
axis.transform.position = selectedPart.position + axisOffset;
}
}
private bool IsDescendant(Transform child, Transform parent)
{
foreach (Transform t in parent)
{
if (t == child)
return true;
if (IsDescendant(child, t))
return true;
}
return false;
}
private Transform GetClickedPart(Transform parent)
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
Transform clickedPart = hit.transform;
if (IsDescendant(clickedPart, parent))
{
return clickedPart;
}
}
return null;
}
public void ToggleControlEnabled()
{
isControlEnabled = !isControlEnabled;
animator.enabled = !animator.enabled;
if (!isControlEnabled && selectedPart != null)
{
Destroy(outline);
selectedPart = null;
axis.SetActive(false);
}
}
}
```
修改后的代码实现了通过点击拖拽坐标轴来带动被点击模型零件进行 x、y、z 方向上的位移。修改的主要部分如下:
- 在 Update 方法中,如果 selectedPart 不为空,将 axis 的位置设置为 selectedPart 的位置加上 axisOffset。这样可以拖动坐标轴来带动模型零件进行位移。
- 在 GetClickedPart 方法中,添加了一个 parent 参数,用于限定只寻找指定父物体下的模型零件。这样可以避免出现未预期的选择情况。
- 在拖拽操作中,计算出局部坐标系下的偏移量之后,使用 Mathf.Round 方法将其四舍五入到小数点后三位。将小数点后的位数调小可以让模型零件的移动更加精确。最后,将 x、y、z 偏移量分别加给 selectedPart 的 position 属性即可实现位移。