一、Unity動畫
Unity動畫是Unity中最基本的動畫類型,可以控制物體的各個屬性。通過Unity動畫編輯器,可以創建和編輯動畫,包括位置、旋轉、縮放、材質、顏色和混合形式等。在創建動畫時,可以設置動畫的幀率、循環方式、播放速度和事件觸發等信息。
二、Unity讓物體沿路徑移動
Unity可以通過路徑動畫讓物體沿固定的路徑運動。這種動畫方式可以很容易地創建連續的動畫效果,如沿著3D路徑繞圈、在2D遊戲中移動角色、或者讓遊戲中的小車順著沿路行駛。
三、Unity動畫位置選取
在創建路徑動畫時,需要選擇物體運動的位置。Unity路徑動畫提供了三個不同的選址方式,分別是Transform選址、Curve選址和Object選址。
四、Transform選址
Transform選址是在對象的Transform組件上設置關鍵幀來控制物體運動的位置。通過在場景中選擇物體並添加「Animation Clip」後,在動畫編輯器中選擇導出Transform來實現Transform選址。例如,假設想讓一個球從場景的一個點移動到另一點,可以在坐標點上設置關鍵幀來控制物體的位置。
<pre><code>using UnityEngine;
public class MoveBall : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
AnimationClip clip = new AnimationClip();
AnimationCurve curveX = new AnimationCurve();
curveX.AddKey(0f, transform.position.x);
curveX.AddKey(1f, 10f);
clip.SetCurve("", typeof(Transform), "localPosition.x", curveX);
AnimationCurve curveZ = new AnimationCurve();
curveZ.AddKey(0f, transform.position.z);
curveZ.AddKey(1f, 10f);
clip.SetCurve("", typeof(Transform), "localPosition.z", curveZ);
clip.wrapMode = WrapMode.Loop;
GetComponent().clip = clip;
GetComponent().Play();
}
}
五、Curve選址
Curve選址是通過自定義路徑曲線來控制對象運動的位置。曲線的控制點可以通過手動設置或者演算法計算等方式來實現。例如,在2D遊戲中,通過使用Bezier曲線來控制物體的位置。
<pre><code>using UnityEngine;
public class MoveCurve : MonoBehaviour
{
public Transform[] points;
public float speed = 5f;
public float vertexCount = 50f;
float currentDist;
// Update is called once per frame
void Update()
{
currentDist += Time.deltaTime * speed;
int currentIndex = Mathf.FloorToInt(currentDist / vertexCount);
float currentT = (currentDist % vertexCount) / vertexCount;
float oneMinusT = 1f - currentT;
Vector3 pos = Mathf.Pow(oneMinusT, 3f) * points[currentIndex].position
+ 3f * Mathf.Pow(oneMinusT, 2f) * currentT * points[currentIndex + 1].position
+ 3f * oneMinusT * Mathf.Pow(currentT, 2f) * points[currentIndex + 2].position
+ Mathf.Pow(currentT, 3f) * points[currentIndex + 3].position;
transform.position = pos;
}
}
六、Object選址
Object選址是通過將特定的遊戲對象傳遞到動畫機來控制物體的位置。例如,在2D遊戲中,創建一個「Waypoints」對象,並將敵人的移動軌跡掛載到該對象上,即可實現Object選址。
<pre><code>using UnityEngine;
public class MoveObject : MonoBehaviour
{
public GameObject waypoints;
public float speed = 1f;
private int currentWaypointIndex = 0;
// Update is called once per frame
void Update()
{
Vector3 targetPosition = waypoints.transform.GetChild(currentWaypointIndex).position;
transform.position = Vector3.MoveTowards(transform.position, targetPosition, speed * Time.deltaTime);
if (transform.position == targetPosition)
{
currentWaypointIndex++;
if (currentWaypointIndex >= waypoints.transform.childCount)
{
currentWaypointIndex = 0;
}
}
}
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/201004.html