Unity 使用任意一個局部軸指向目標
效果:
主要用于在編輯器中可視化對象的朝向,同時提供了選擇不同軸向的功能。在運行時,物體將根據(jù)所選擇的軸向朝向目標,并在 Scene 視圖中繪制一個帶箭頭的圓環(huán)。文章來源:http://www.zghlxwxcb.cn/news/detail-801437.html
定義軸向枚舉:
public enum OnlyAxis
{
x_Axis,
y_Axis,
z_Axis
}
- 這是一個用于表示軸向的枚舉,包括 x 軸、y 軸和 z 軸。
定義變量:
public Transform target; // 要指向的目標物體
[Header("追蹤軸向")]
public OnlyAxis Axis = OnlyAxis.x_Axis; // 選擇旋轉的軸向
private OnlyAxis CurrentAxis = OnlyAxis.x_Axis; // 當前軸向
- target: 用于指定需要朝向的目標物體。
- Axis: 用于在 Inspector 窗口中選擇旋轉的軸向。
- CurrentAxis: 用于在運行時跟蹤當前的軸向。
主要計算:
private void Update()
{
SetAxis(Axis);
// 獲取目標方向
Vector3 targetDirection = target.position - transform.position;
Vector3 RotateAxis = transform.up;
// 根據(jù)選擇的軸向,獲取目標方向在對應軸上的投影
Vector3 axisDirection = Vector3.zero;
switch (CurrentAxis)
{
case OnlyAxis.x_Axis:
axisDirection = Vector3.ProjectOnPlane(targetDirection, transform.right);
break;
case OnlyAxis.y_Axis:
axisDirection = Vector3.ProjectOnPlane(targetDirection, transform.up);
break;
case OnlyAxis.z_Axis:
axisDirection = transform.forward;
Vector3 dirTemp = transform.forward.normalized;
RotateAxis = Vector3.ProjectOnPlane(targetDirection, dirTemp);
break;
}
// 計算旋轉角度
Quaternion newRotation = Quaternion.LookRotation(axisDirection, RotateAxis);
transform.rotation = newRotation;
}
- SetAxis 方法用于在運行時更新 CurrentAxis,確保在不同的軸向之間正確切換。
- 在 Update 方法中,獲取目標方向,并根據(jù)當前選擇的軸向計算相應的旋轉。最后,將物體的旋轉設為新的旋轉。
OnDrawGizmosSelected 方法(僅在編輯器中生效):
#if UNITY_EDITOR
private void OnDrawGizmosSelected()
{
DrawCircle();
}
public bool is3DDraw = false;
public float radius = 0.1f;
public float arrowLength = 0.01f;
int segments = 20;
private void DrawCircle()
{
float Radius = is3DDraw ? radius : radius * Vector3.Distance(transform.position, SceneView.lastActiveSceneView.camera.transform.position);
float ArrowLength = is3DDraw ? arrowLength : arrowLength * Vector3.Distance(transform.position, SceneView.lastActiveSceneView.camera.transform.position);
Gizmos.color = Color.green;
Vector3 center = transform.position;
Quaternion rotation = transform.rotation;
float angleIncrement = 360f / segments;
for (int i = 0; i < segments; i++)
{
float angle = i * angleIncrement;
Vector3 point = Vector3.zero;
float nextAngle = (i + 1) * angleIncrement;
Vector3 nextPoint = Vector3.zero;
// 根據(jù)所選軸向,調整旋轉
switch (Axis)
{
case OnlyAxis.x_Axis:
point = center + rotation * Quaternion.Euler(angle, 0, 0) * (Vector3.up * Radius);
nextPoint = center + rotation * Quaternion.Euler(nextAngle, 0, 0) * (Vector3.up * Radius);
if (i == 0)
{
Gizmos.DrawLine(nextPoint, center + rotation * Quaternion.Euler(angle + angleIncrement / 2, 0, 0) * (Vector3.up * (Radius + ArrowLength)));
Gizmos.DrawLine(nextPoint, center + rotation * Quaternion.Euler(angle + angleIncrement / 2, 0, 0) * (Vector3.up * (Radius - ArrowLength)));
}
break;
case OnlyAxis.y_Axis:
point = center + rotation * Quaternion.Euler(0, angle, 0) * (Vector3.right * Radius);
nextPoint = center + rotation * Quaternion.Euler(0, nextAngle, 0) * (Vector3.right * Radius);
if (i == 0)
{
Gizmos.DrawLine(nextPoint, center + rotation * Quaternion.Euler(0, angle + angleIncrement / 2, 0) * (Vector3.right * (Radius + ArrowLength)));
Gizmos.DrawLine(nextPoint, center + rotation * Quaternion.Euler(0, angle + angleIncrement / 2, 0) * (Vector3.right * (Radius + -ArrowLength)));
}
break;
case OnlyAxis.z_Axis:
point = center + rotation * Quaternion.Euler(0, 0, angle) * (Vector3.right * Radius);
nextPoint = center + rotation * Quaternion.Euler(0, 0, nextAngle) * (Vector3.right * Radius);
if (i == 0)
{
Gizmos.DrawLine(nextPoint, center + rotation * Quaternion.Euler(0, 0, angle + angleIncrement / 2) * (Vector3.right * (Radius + ArrowLength)));
Gizmos.DrawLine(nextPoint, center + rotation * Quaternion.Euler(0, 0, angle + angleIncrement / 2) * (Vector3.right * (Radius + -ArrowLength)));
}
break;
}
if (i != 1) Gizmos.DrawLine(point, nextPoint);
}
}
#endif
- OnDrawGizmosSelected 方法用于在 Scene 視圖中繪制圓環(huán)。
- DrawCircle 方法根據(jù)選擇的軸向,繪制一個圓環(huán)并在第一個點上畫一個箭頭。
點擊下載Demo文章來源地址http://www.zghlxwxcb.cn/news/detail-801437.html
到了這里,關于Unity 旋轉跟隨的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!