【问题标题】:Call function from another script从另一个脚本调用函数
【发布时间】:2014-07-27 17:01:10
【问题描述】:

我正在编写一个简单的游戏(我自己做的第一个游戏),其中基本上有两个进球,当一名球员进球时,我想将所有球员的位置重置为某个坐标。

我有一个附加到目标的脚本,它检测与球的碰撞,如下所示:

目标.js

#pragma strict

function OnTriggerEnter2D (hitInfo : Collider2D) {
    if (hitInfo.name == "Ball")
    {
        var wallName = transform.name;
        GameManager.Score (wallName);
        hitInfo.gameObject.SendMessage ("ResetBall");

        //Here I need to call the ResetPlayer function
        PlayerControlHS.ResetPlayer();
    }
}

以下脚本附在播放器上

PlayerControlHS.js

#pragma strict

var resetPosX : float;
var resetPosY : float;

//keys
var moveUp : KeyCode;
var moveLeft : KeyCode;
var moveRight : KeyCode;

var speed : int = 4;

function Update () {
    if (Input.GetKey(moveUp)) {
        rigidbody2D.velocity.y = speed;
    }
    if (Input.GetKey(moveLeft)) {
        rigidbody2D.velocity.x = -speed;
    }
    else if (Input.GetKey(moveRight)) {
        rigidbody2D.velocity.x = speed;
    }
    else {
        rigidbody2D.velocity.x = 0;
    }
}

function ResetPlayer () {
    Debug.Log("I'm being called");
}

目标和球员都有一个 RigidBody 2D 和某种对撞机,还有球。 我已经得到了现在调用的函数,但是如果我尝试修改玩家的位置坐标,我会进入一个死亡错误循环,当我修复一个时,我会得到另一个。

当我将此代码放入 ResetPlayer() 时会发生这种情况:

rigidbody2D.position.x = resetPosX;
rigidbody2D.position.y = resetPosY;

大多数情况下,这些错误是因为我需要一个 PlayerControlHS 类型的对象来访问这些字段。我尝试添加该类型的变量(并将其引用给每个玩家)但它不起作用,因为它告诉我我需要一个对象来访问该变量......如果我不知道如何初始化它使其成为静态的。

我怎样才能让它工作?

编辑:我认为最好的方法是发送一条消息,就像 ResetBall 一样,但它不起作用(我认为因为该函数是从球调用的,另一种类型的对象并且它找不到功能)。这样,函数 ResetPlayer 就可以不再是静态的了。但我不确定这是否正确,因为我无法在没有编译错误的情况下得到它。

EDIT2:它起作用了,即使我不得不把它放在一个衬里

hitInfo.gameObject.GetComponent(PlayerControlHS).ResetPlayer();

因为 Unity 告诉我需要在此处放置分号(我不明白 :S):

PlayerControlHS playerScript ; = hitInfo.gameObject.getComponent(PlayerControlHS);

但我还是无法修改位置的变量...

我已尝试修复它,但我收到一条错误消息,提示“我需要 UnityEngine.Component 类型的实例来访问我所做的变量声明中的非静态成员 'rigidBody2D'

static var test : PlayerControlHS = rigidbody2D.GetComponent(PlayerControlHS);

我在 ResetPlayer 中尝试的代码:

test.GetComponent(PlayerControlHS).rigidbody2D.position.x = test.GetComponent(PlayerControlHS).resetPosX;
test.GetComponent(PlayerControlHS).rigidbody2D.position.y = test.GetComponent(PlayerControlHS).resetPosY;

【问题讨论】:

    标签: unity3d unityscript


    【解决方案1】:

    尝试改变这一行:

    PlayerControlHS.ResetPlayer();
    

    对此:

    PlayerControlHS playerScript = hitInfo.gameObject.getComponent(PlayerControlHS);
    playerScript.ResetPlayer();
    

    这就是你从另一个脚本调用函数的方式。

    编辑 1:

    抱歉,即使您使用的是 javascript,我还是把 C# 弄混了,我知道您为什么会出现这个错误。变量声明略有不同。

    把上面的代码改成这样:

    var playerScript:PlayerControlHS  = hitInfo.gameObject.GetComponent(PlayerControlHS);
    playerScript.ResetPlayer();
    

    至于重置玩家的位置,脚本在玩家游戏对象内部不是吗?然后你可以像这样简化它:

    function ResetPlayer () {
        rigidbody2D.position.x = resetPosX;
        rigidbody2D.position.y = resetPosY;
    }
    

    真的很抱歉:(

    【讨论】:

    • 一个班轮是什么意思?
    • 我更新了主帖,因为回复太长了。谢谢。
    • 不错的一个。如果可行,请考虑接受我的回答:)
    • 它部分工作,我仍然有修改玩家位置的问题。您知道如何以干净的方式完成吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    相关资源
    最近更新 更多