从另一个脚本调用函数

时间:2014-07-26 23:47:40

标签: unity3d unityscript

我正在编写一个简单的游戏(我自己做的第一个),其中基本上有两个得分目标,当玩家得分时,我想将所有玩家的位置重置为某些坐标。

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

Goal.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;

1 个答案:

答案 0 :(得分:2)

尝试更改此行:

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

真的很抱歉:(