【发布时间】: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