【问题标题】:Run a script on a gameobject once在游戏对象上运行一次脚本
【发布时间】:2015-11-19 02:48:15
【问题描述】:

我有一个脚本,它使用 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);
    }
}

但是,我只希望它在我单击一个游戏对象时运行一次,然后在它完成移动它时将其与该对象分离,以便下次我单击另一个对象时它可以再次运行。

我有一个附加到相机的光线投射设置,允许我选择游戏对象,我只是不知道如何在所选对象上运行此脚本!

我该怎么做?

【问题讨论】:

  • @FarhanAnam,对于 c# 和 unity 来说都是全新的,所以我不知道那是什么

标签: c# unity3d


【解决方案1】:

重命名您的 Start 方法

void Start() { ... }

其他组件可以公开访问的东西,即:

public void BeginMove() { ... }

然后,让您的 Raycast 脚本调用您的新函数。您需要访问被点击的 GameObject 的 MovePiece 组件:

...
GameObject hitObject = raycastHit.collider.gameObject;
MovePiece hitObjectMovePiece = hitObject.getComponent<MovePiece>();
hitObjectMovePiece.BeginMove();

您可能还想在动画中引入布尔锁。您的代码可能如下所示。

    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;
    }
}

希望对您有所帮助!祝你好运。

【讨论】:

  • 这似乎应该可以工作,但是我在调​​用BeginMove() 函数的行上得到了一个object reference not set to an instance of an object
  • @James Hm,您的对象的 Collider 是否在子变换中?确保您的“MovePiece”组件位于具有 Collider 的同一个 GameObject 上,或者将“MovePiece”放在根 GameObject 上,并更改此行:“GameObject hitObject = raycastHit.collider.gameObject;”对此:'GameObject hitObject = raycastHit.collider.transform.root.gameObject;'在你的 Raycast 函数中打印一个快速的 'Debug.Log(hitObject.name + " selected")',这样你就可以很容易地知道哪个对象实际上被选中了。
  • 目前远离电脑生病所以我不能尝试这个,我没有粗鲁,我会尽快回复你
猜你喜欢
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多