我有一个脚本,它使用 Unity 引擎的 lerp
功能处理游戏对象随时间的转换。
public class MovePiece : MonoBehaviour {
Vector3 startPoint;
Vector3 endPoint;
float speed = 1;
float startTime;
float journeyLength;
void Start() {
startPoint = gameObject.GetComponent<Transform>().position;
endPoint = startPoint + new Vector3(20, 0, 0); //Will make this a variable eventually
startTime = Time.time;
journeyLength = Vector3.Distance(startPoint, endPoint);
}
void Update() {
float distCovered = (Time.time - startTime) * speed;
float fracJourney = distCovered / journeyLength;
transform.position = Vector3.Lerp(startPoint, endPoint, fracJourney);
}
}
但是,我只希望它在我单击一个游戏对象时运行一次,然后在它完成移动后将其自身与该对象分离,以便下次我单击另一个对象时它可以再次运行。
我有一个连接到相机的光线转换设置,它允许我选择游戏对象,我只是不知道我如何在选定的对象上运行这个脚本!
我该怎么做?
最佳答案
重命名您的 Start 方法
void Start() { ... }
其他组件可以公开访问的内容,即:
public void BeginMove() { ... }
然后,让您的 Raycast 脚本调用您的新函数。您需要访问被单击的游戏对象的 MovePiece 组件:
...
GameObject hitObject = raycastHit.collider.gameObject;
MovePiece hitObjectMovePiece = hitObject.getComponent<MovePiece>();
hitObjectMovePiece.BeginMove();
您可能还想在动画中引入 bool 锁。您的代码可能如下所示。
public class MovePiece : MonoBehaviour {
Vector3 startPoint;
Vector3 endPoint;
float speed = 1;
float startTime;
float journeyLength;
// Animation lock
private bool moving = false;
public void BeginMove() {
startPoint = gameObject.GetComponent<Transform>().position;
endPoint = startPoint + new Vector3(20, 0, 0); //Will make this a variable eventually
startTime = Time.time;
journeyLength = Vector3.Distance(startPoint, endPoint);
moving = true;
}
void Update() {
if(!moving)
return;
float distCovered = (Time.time - startTime) * speed;
float fracJourney = distCovered / journeyLength;
transform.position = Vector3.Lerp(startPoint, endPoint, fracJourney);
if(fracJourney >= 1.0f)
moving = false;
}
}
希望对您有所帮助!祝你好运。
关于c# - 在游戏对象上运行一次脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33754327/