可从 Inspector 编辑的转换列表
List of Transforms editable from Inspector
我正在使用 Unity 5,我需要创建一个变换列表,以便在检查器中修改它们(位置和旋转)以模拟不同的相机。此模拟用于演示,就像演示期间相机自行移动一样。
我目前有一个转换列表,但我不知道如何在检查器中修改它们并在运行时更改它们的位置?
编辑:2015 年 11 月 18 日
这是解决方案,如果在我朋友的帮助下找到更了解 unity 真正作用的方法,希望它能对您有所帮助,再次感谢您的所有回复,它对我帮助很大 :D :
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class MoveCamera : MonoBehaviourSingleton<MoveCamera>
{
public List<Transform> cameraPositions = new List<Transform>();
private Transform m_Target;
private float m_Speed;
private bool m_Translate;
private bool m_Rotate;
public void SwitchToNext(int index, float speed)
{
m_Target = cameraPositions[index];
m_Translate = true;
m_Rotate = true;
}
public void Update()
{
if (m_Target != null && (m_Translate || m_Rotate))
{
float ratio = Time.deltaTime * m_Speed;
transform.position = Vector3.Lerp(transform.position, m_Target.position, ratio);
transform.rotation = Quaternion.Slerp(transform.rotation, m_Target.rotation, ratio);
if (Vector3.Distance(transform.position, m_Target.position) < 0.001f)
{
transform.position = m_Target.position;
m_Translate = false;
}
if (Quaternion.Angle(transform.rotation, m_Target.rotation) < 0.001f)
{
transform.rotation = m_Target.rotation;
m_Rotate = false;
}
}
}
}
好的,让我们看看这是否对您有帮助。(假设您需要这个,我会编写我的代码)
您的场景中有 x 个游戏对象。
您将需要一个游戏对象列表。假设您通过
获得它们
public List<GameObject> myObjectList = new List<GameObject>();
public List<Transform> myTransformList = new List<Transform>();
myObjectList = GameObject.FindGameObjectsWithTag("YourCustomTagHere");
foreach(Gameobject g in myObjectList)
{
myTransformList.Add(g.transform);
}
我不知道这段代码是否有效,我现在不能测试它,但我认为逻辑是存在的。继续尝试一些事情,无论您是否成功,都请提供一些反馈。
我建议在您的 MoveCamera
脚本中只添加一个简单的 public 列表,然后将目标拖到该列表中。这样做你可以完全控制对象的顺序,因此你可以从相机位置 n 到 n + 1 进行动画转换。
public List<Transform> cameraPositions = new List<Transform> ();
也许一个简单的序列不符合您的要求,您需要一种更复杂的方法来决定允许哪个位置切换到另一个位置。在这种情况下,我会建议一个帮助脚本,例如CameraTransition.cs
。您可以在此处放置检查逻辑和定义参数。
将此附加到每个允许的目标位置对象,并将 MoveCamera
中的列表替换为 List<CameraTransition>
。
我正在使用 Unity 5,我需要创建一个变换列表,以便在检查器中修改它们(位置和旋转)以模拟不同的相机。此模拟用于演示,就像演示期间相机自行移动一样。
我目前有一个转换列表,但我不知道如何在检查器中修改它们并在运行时更改它们的位置?
编辑:2015 年 11 月 18 日
这是解决方案,如果在我朋友的帮助下找到更了解 unity 真正作用的方法,希望它能对您有所帮助,再次感谢您的所有回复,它对我帮助很大 :D :
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class MoveCamera : MonoBehaviourSingleton<MoveCamera>
{
public List<Transform> cameraPositions = new List<Transform>();
private Transform m_Target;
private float m_Speed;
private bool m_Translate;
private bool m_Rotate;
public void SwitchToNext(int index, float speed)
{
m_Target = cameraPositions[index];
m_Translate = true;
m_Rotate = true;
}
public void Update()
{
if (m_Target != null && (m_Translate || m_Rotate))
{
float ratio = Time.deltaTime * m_Speed;
transform.position = Vector3.Lerp(transform.position, m_Target.position, ratio);
transform.rotation = Quaternion.Slerp(transform.rotation, m_Target.rotation, ratio);
if (Vector3.Distance(transform.position, m_Target.position) < 0.001f)
{
transform.position = m_Target.position;
m_Translate = false;
}
if (Quaternion.Angle(transform.rotation, m_Target.rotation) < 0.001f)
{
transform.rotation = m_Target.rotation;
m_Rotate = false;
}
}
}
}
好的,让我们看看这是否对您有帮助。(假设您需要这个,我会编写我的代码) 您的场景中有 x 个游戏对象。
您将需要一个游戏对象列表。假设您通过
获得它们public List<GameObject> myObjectList = new List<GameObject>();
public List<Transform> myTransformList = new List<Transform>();
myObjectList = GameObject.FindGameObjectsWithTag("YourCustomTagHere");
foreach(Gameobject g in myObjectList)
{
myTransformList.Add(g.transform);
}
我不知道这段代码是否有效,我现在不能测试它,但我认为逻辑是存在的。继续尝试一些事情,无论您是否成功,都请提供一些反馈。
我建议在您的 MoveCamera
脚本中只添加一个简单的 public 列表,然后将目标拖到该列表中。这样做你可以完全控制对象的顺序,因此你可以从相机位置 n 到 n + 1 进行动画转换。
public List<Transform> cameraPositions = new List<Transform> ();
也许一个简单的序列不符合您的要求,您需要一种更复杂的方法来决定允许哪个位置切换到另一个位置。在这种情况下,我会建议一个帮助脚本,例如CameraTransition.cs
。您可以在此处放置检查逻辑和定义参数。
将此附加到每个允许的目标位置对象,并将 MoveCamera
中的列表替换为 List<CameraTransition>
。