我正在编写一个简单的游戏(我自己做的第一个),其中基本上有两个得分目标,当玩家得分时,我想将所有玩家的位置重置为某些坐标。
我有一个附加到目标的脚本,用于检测与球的碰撞,如下所示:
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;
答案 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;
}
真的很抱歉:(