2014-09-02 5 views
0

Я пытаюсь использовать свой скрипт коллекции пули, чтобы удалить и возродить игрока, когда их здоровье опустится ниже 1. Однако мой скрипт для вызова функции единства C# не работает правильно, это говорит что функция им пытаются назвать этоUnity Multiplayer Respawn Calling C# from Unityscript

Активы/Уровни/Ресурсы/bulletCollision.js (27,16): BCE0019: 'SpawnMyPlayer' не является членом 'UnityEngine.Component'.

Также это правильный способ возродить убитого игрока?

NetworkManager.cs:

using UnityEngine; 
using System.Collections; 

public class NetworkManager : MonoBehaviour { 
    public Camera standbyCamera; 
    // Use this for initialization 
    SpawnSpot[] spawnSpots; 
    void Start() { 
     Connect(); 
     spawnSpots = GameObject.FindObjectsOfType<SpawnSpot>(); 
    } 

    void Connect(){ 
     PhotonNetwork.ConnectUsingSettings ("1.0.0"); 
    } 

    void OnGui(){ 
     Debug.Log ("OnGui" + PhotonNetwork.connectionStateDetailed.ToString()); 
     GUILayout.Label (PhotonNetwork.connectionStateDetailed.ToString()); 
    } 
    // Update is called once per frame 
    void OnJoinedLobby() { 
     Debug.Log ("Joined Lobby"); 
     PhotonNetwork.JoinRandomRoom(); 
     } 
    void OnPhotonRandomJoinFailed(){ 
     Debug.Log ("Failed Join"); 
     PhotonNetwork.CreateRoom (null); 
    } 
    void OnJoinedRoom() { 
     Debug.Log ("Joined Room"); 
     SpawnMyPlayer(); 
    } 
    void SpawnMyPlayer(){ 
     SpawnSpot mySpawnSpot = spawnSpots [ Random.Range (0, spawnSpots.Length) ]; 

     GameObject myPlayer = PhotonNetwork.Instantiate ("Player", mySpawnSpot.transform.position, mySpawnSpot.transform.rotation, 0); 
     standbyCamera.enabled = false; 

     ((MonoBehaviour)myPlayer.GetComponent("FPSInputController")).enabled = true; 
     ((MonoBehaviour)myPlayer.GetComponent("PlayerCounters")).enabled = true; 
     ((MonoBehaviour)myPlayer.GetComponent("Tankbody")).enabled = true; 
     ((MonoBehaviour)myPlayer.GetComponent("tankMove")).enabled = true; 
     ((MonoBehaviour)myPlayer.GetComponent("CharacterMotor")).enabled = true; 
     myPlayer.transform.FindChild("Main Camera").gameObject.SetActive(true); 

    } 
} 

пуля collision.js:

#pragma strict 

var myClip: AudioClip; 
var damage :float = 0; 
var bullet_force: float = shoot.shootForce; 


function OnCollisionEnter (collision : Collision) 
{ 

    Destroy(gameObject); 

if(collision.transform.name ==("TankBody")){ 
    var hitCount = gameObject.Find("HitCount").GetComponent(GUIText); 
    damage = Random.Range(10,30); 
    PlayerCounters.playerHealth -= damage; 
    hitCount.text = "Hit: " + damage.ToString(); 

    AudioSource.PlayClipAtPoint(myClip, transform.position); 

    if(PlayerCounters.playerHealth <0){ 
     Destroy(gameObject.Find("Player")); 
     PlayerCounters.playerHealth = 0; 
     PlayerCounters.playerKills += 1; 
     var cs = GameObject.Find("CSharpGameObj"); 
     var script = cs.GetComponent("NetworkManager"); 
     script.SpawnMyPlayer(); 
    } 

} 

} 
+2

Я действительно подумайте, что стоит потратить время на то, чтобы ваш код был чистым C#. Его просто будет больно для вас, если вы этого не сделаете. –

+0

ahh yea thats, вероятно, хорошая идея, но все учебники всегда находятся в javascript. –

+0

Вместо того, чтобы уничтожить объект игрока, я бы переустановил местоположение игрока и просто сбросил состояние игрока до того, каково бы ни было состояние респауна по умолчанию. Потому что его более чем вероятно дешевле просто сохранить один и тот же экземпляр. Использование Destroy - это то, что используется при работе с более доступными ресурсами, такими как враги и предметы. – Terrance

ответ

1

Ваша проблема связана с Unity3d компиляции C# и JavaScript в проходах. Файлы Javascript скомпилированы до C# файлов и, следовательно, не могут найти ваш класс C#.

Существует способ обойти это!

Вы должны создать папку под названием «Плагины» в папке с вашими ресурсами и перенести свой сценарий C# в эту папку. Он будет скомпилирован перед вашим файлом javascript. И вы должны найти, что ваш JS-скрипт теперь может ссылаться на скрипт C#.

В коде:

var cs = GameObject.Find("CSharpGameObj"); 
    var script :NetworkManager; 
    script = cs.GetComponent("NetworkManager"); 
    script.SpawnMyPlayer(); 

Кстати вы должны сделать функцию общественности SpawnMyPlayer, добавив общественности к своей декларации, прежде чем она может быть доступна извне:

public void SpawnMyPlayer(){ 
+0

Огромное вам спасибо, я новичок в единстве, особенно C# Я ценю всех ваших ребят. –

+0

если вы удовлетворены, пожалуйста, подтвердите ответ. – Rudolfwm

+0

это сработало, но я закончил переписывать все на C# –