usingSystem.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
public class SimpleRotate : MonoBehaviour
{
public GameObject objToRotateAround;
[Header("它將圍繞的軸")]
public Vector3 axis;
[Header("每次更新覆寫的角度")]
public float angle;
public bool randomAngle = false;
public float upperLimit, lowerLimit, delay;
private float height, prevHeight, time, prevAngle;
//Update每幀被呼叫一次。
void Update()
{
time = Time.deltaTime。
if (time > delay)
{
prevAngle = angle;
prevHeight = height;
height = Random.Range(lowerLimit, upperLimit);
prevAngle = Random.Range(-0.25f, 0.25f) 。
time = 0;
}
if (randomAngle)
{
transform.RotateAround(objToRotateAround.transform.position, axis.normalized,
Mathf.Lerp(prevAngle, angle, time))。
}
else new Vector3(transform.position.x, Mathf.Lerp(prevHeight, height, time), transform.position.z) 。
}
}
這個角度如果我把它改成小值,物體就會旋轉得比較慢,而大值則比較快。 所以我不明白,這個角度只是一個速度因素?那為什么不呼叫速度變數而要呼叫角度呢?
第二個問題是我如何在運行時控制旋轉的半徑?例如,如果我想讓物件在他旋轉的目標物件附近旋轉,或者在很遠的地方旋轉。
uj5u.com熱心網友回復:
那么為什么不呼叫變數速度而要呼叫角度呢?
這是c#,你可以呼叫你的欄位和變數,只要你方便。
所以請繼續前進,并呼叫你想要的任何東西
。就個人而言,我寧愿將其稱為anglePerSecond,然后再適當地將其乘以Time.deltaTime。
您當前的代碼是幀速率相關的,意味著您每幀旋轉一個固定的角度,而這通常不是您想要做的。
例如(注意:我暫時洗掉了隨機角度的部分,因為它對我來說也沒有什么意義)
public class SimpleRotate : MonoBehaviour
{
public GameObject objToRotateAround;
[]
public Vector3 axis;
[]
public float anglePerSecond;
public float upperLimit;
public float lowerLimit;
public float delay;
private float高度。
private float prevHeight;
private float time;
void Update()
{
time = Time.deltaTime。
if (time > delay)
{
prevHeight = height;
height = Random.Range(lowerLimit, upperLimit);
time = 0;
}
//以獨立于幀速率的角度每秒旋轉一次。
transform.RotateAround(objToRotateAround.transform.position, axis, anglePerSecond * Time.deltaTime)。)
//對于Lerp,你想要一個0到1的系數。
//不是在0和延遲之間。
//===>除以delay可以得到一個在0和1之間的系數。
transform.position = new Vector3(transform.position.x, Mathf.Lerp(prevHeight, height, time / delay), transform.position.z) 。
}
}
第二個問題是,我怎樣才能在運行時控制旋轉的半徑呢?
您使用RotateAround將您的物件圍繞另一個物件的位置進行旋轉。
正如你所看到的,旋轉半徑取決于一個單一因素。你的物件和旋轉樞軸之間的距離。
因此,將這個物件移到靠近旋轉樞軸的位置。
所以將這個物件移近objToRotateAround => 半徑更小
你可以在運行時使用例如
來調整這一點。[SerializeField] private float radius;
private float LastRadius;
private void Start ()
{
ApplyRadius()。
}
private void Update () ?
{
//檢查半徑是否被改變。
if(!Mathf.Approximately(radius, lastRadius))
{
ApplyRadius ();
}
//...。你的其余代碼
}
private void ApplyRadius()
{
//獲得從支點到當前物件位置的偏移矢量。
var direction = (transform.position - objectToRotateAround.transform.position).normalized;
//設定你的物件在相同的方向,但距離為半徑。
transform.position = objectToRotateAround direction * radius;
lastRadius = radius;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/312438.html
標籤:
