【问题标题】:Running Javascript code on Unity giving error.在 Unity 上运行 Javascript 代码给出错误。
【发布时间】:2016-06-02 18:33:26
【问题描述】:

大家好,尝试构建一个简单的游戏,

这是我的代码 当我运行此代码时,它给了我错误“playerMovement”不是“UnityEngine.Rigidbody”的成员。

public var speed : int = 15;
var player : Rigidbody;
var player2 : Rigidbody;

function Start () {
player = GetComponent.<Rigidbody>();
player2 = GetComponent.<Rigidbody>();
}

function playerMovement(){
if(Input.GetKey(KeyCode.UpArrow)){
    player.AddForce(Vector3.forward*speed);
    Debug.Log("Player 1 is moving forward");
}
if(Input.GetKey(KeyCode.DownArrow)){
    player.AddForce(Vector3.back*speed);
}
if(Input.GetKey(KeyCode.LeftArrow)){
    player.AddForce(Vector3.left*speed);
}
if(Input.GetKey(KeyCode.RightArrow)){
    player.AddForce(Vector3.right*speed);
}

}

function player2Movement(){
if(Input.GetKey(KeyCode.UpArrow)){
    player2.AddForce(Vector3.forward*speed);
    Debug.Log("Player 2 is moving forward");
}
if(Input.GetKey(KeyCode.DownArrow)){
    player2.AddForce(Vector3.back*speed);
}
if(Input.GetKey(KeyCode.LeftArrow)){
    player2.AddForce(Vector3.left*speed);
}
if(Input.GetKey(KeyCode.RightArrow)){
    player2.AddForce(Vector3.right*speed);
}

} 

function Update () {
player.playerMovement();
player2.playerMovement();
}

它给了我错误“playerMovement”不是“UnityEngine.Rigidbody”的成员。 如何解决这个问题。

【问题讨论】:

  • 函数更新() { player.playerMovement(); player2.playerMovement(); }
  • 那是什么意思
  • 我写了一个答案,但我现在看到它有点复杂所以删除它。所以你真正想要的是从 player1 和 player2 有两个单独的脚本。您尝试了从 RigidBody 参考中神奇地调用 playerMovement 方法。
  • 我们不能在一个脚本中制作它并为每个玩家制作两个方法并在更新方法中调用它们
  • 当然可以。但是,问题是您真正想要的 - 现在您将在 smae 时间内移动两个玩家对象,因为他们使用相同的键码两次触发移动。你需要我问一些逻辑来分开触发它们的动作。

标签: javascript unity3d game-engine


【解决方案1】:

将代码从C# 移植到Javascript 时需要注意。

player.playerMovement();
player2.playerMovement();

您调用的函数都在同一个脚本中。

直接打电话给他们。

playerMovement();
player2Movement();

还要注意 player2Movement 上面代码中的错误拼写变化。

即使您修复了该问题,它也将无错误地编译,但由于以下原因无法按预期工作:

player = GetComponent.<Rigidbody>();
player2 = GetComponent.<Rigidbody>();

因为你有不同的游戏对象/球要移动。您必须先使用GameObject.Find 找到它们,然后才能获取它们每个的Rigidbody 引用。

player = GameObject.Find("Ball1").GetComponent.<Rigidbody>();
player2 =  GameObject.Find("Ball2").GetComponent.<Rigidbody>();

最后,控件搞砸了。您正在使用相同的控件。我认为这是一个糟糕的复制和粘贴之类的东西,但下面是你的整个工作代码。

注意

在你说它不起作用之前,请确保你的两个游戏对象/球被命名为 Ball1Ball2 并确保旧的 C# 冷是不依附于他们。该代码已经过测试并且可以正常工作!

#pragma strict

public var speed : int = 15;
var player : Rigidbody;
var player2 : Rigidbody;

function Start () {
    player = GameObject.Find("Ball1").GetComponent.<Rigidbody>();
    player2 =  GameObject.Find("Ball2").GetComponent.<Rigidbody>();
}

function playerMovement(){
    if (Input.GetKey(KeyCode.A))
    {
        player.AddForce(Vector3.left * speed);
    }

    if (Input.GetKey(KeyCode.D))
    {
        player.AddForce(Vector3.right * speed);
    }

    if (Input.GetKey(KeyCode.W))
    {
        player.AddForce(Vector3.forward * speed);
        Debug.Log("Player 1 is moving forward");
    }
    if (Input.GetKey(KeyCode.S))
    {
        player.AddForce(Vector3.back * speed);
    }
}

function player2Movement(){
    if(Input.GetKey(KeyCode.UpArrow)){
        player2.AddForce(Vector3.forward*speed);
        Debug.Log("Player 2 is moving forward");
    }
    if(Input.GetKey(KeyCode.DownArrow)){
        player2.AddForce(Vector3.back*speed);
    }
    if(Input.GetKey(KeyCode.LeftArrow)){
        player2.AddForce(Vector3.left*speed);
    }
    if(Input.GetKey(KeyCode.RightArrow)){
        player2.AddForce(Vector3.right*speed);
    }

} 

function Update () {
    playerMovement();
    player2Movement();
}

【讨论】:

  • 工作!!!!谢谢负载...我不知道 GameObject.Find 方法..非常感谢
【解决方案2】:

playermovement 函数不是rigidbody 的一部分,它是附加到gameObject 的脚本的一部分 所以每个想要调用它的游戏对象都必须附加这个脚本,你可以通过在脚本中调用playerMovement()来调用它们的移动函数

public var speed : int = 15;
var player : Rigidbody;

function Start () {
player = GetComponent.<Rigidbody>();
}

function playerMovement(){
if(Input.GetKey(KeyCode.UpArrow)){
    player.AddForce(Vector3.forward*speed);
    Debug.Log("Player 1 is moving forward");
}
if(Input.GetKey(KeyCode.DownArrow)){
    player.AddForce(Vector3.back*speed);
}
if(Input.GetKey(KeyCode.LeftArrow)){
    player.AddForce(Vector3.left*speed);
}
if(Input.GetKey(KeyCode.RightArrow)){
    player.AddForce(Vector3.right*speed);
}

}


function Update () {
 playerMovement();
}

而你写的还有另一个问题,那就是你同时用相同的键移动你的两个玩家,所以你必须为每个玩家输入单独的键或使其基于回合,这取决于你游戏

public var speed : int = 15;
var player1Obj: GameObject;
var player2Obj: GameObject;
var player : Rigidbody;
var player2 : Rigidbody;

function Start () {
player = player1Obj.GetComponent.<Rigidbody>();
player2 = player2Obj.GetComponent.<Rigidbody>();
}

function playerMovement(){
if(Input.GetKey(KeyCode.UpArrow)){
    player.AddForce(Vector3.forward*speed);
    Debug.Log("Player 1 is moving forward");
}
if(Input.GetKey(KeyCode.DownArrow)){
    player.AddForce(Vector3.back*speed);
}
if(Input.GetKey(KeyCode.LeftArrow)){
    player.AddForce(Vector3.left*speed);
}
if(Input.GetKey(KeyCode.RightArrow)){
    player.AddForce(Vector3.right*speed);
}

}

function player2Movement(){
if(Input.GetKey(KeyCode.W)){
    player2.AddForce(Vector3.forward*speed);
    Debug.Log("Player 2 is moving forward");
}
if(Input.GetKey(KeyCode.S)){
    player2.AddForce(Vector3.back*speed);
}
if(Input.GetKey(KeyCode.A)){
    player2.AddForce(Vector3.left*speed);
}
if(Input.GetKey(KeyCode.D)){
    player2.AddForce(Vector3.right*speed);
}

} 

function Update () {
playerMovement();
player2Movement();
}

【讨论】:

  • 我有两个游戏对象,我对这两个对象都应用了刚体。现在我正在尝试为它们分配单独的键,以便它们可以移动。我面临的问题是确定如何在我的脚本中链接游戏对象。我写这个播放器 = GetComponent.();对于游戏对象 1 和玩家 2 = GetComponent.();对于gameobject 2,但它仍然没有解决。
  • 先生,巧合的是,我的代码与您的代码相似,它仍然使用单个键移动两个播放器。我认为问题出在 start 函数上,因为我们为 player 和 player2 分配了相同的东西
  • 是的,我改了,通过inspector将玩家一和玩家二这两个游戏对象分配给player1objplayer2obj
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-21
  • 2017-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多