2014-09-02 3 views
0

나는 자신의 체력이 1 이하로 떨어지면 내 총알 컬렉션 스크립트를 사용하여 플레이어를 삭제하고 다시 생성하려고합니다. 그러나 유니티 C# 함수를 호출하는 스크립트는 제대로 작동하지 않습니다. BCE0019 : 전화하려고 함수 메신저유니티 멀티 플레이 Respawn Unityscript에서 C# 호출하기

자산/레벨/자원/bulletCollision.js (27,16)라고 '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

I : 그것은 외부에서 액세스 할 수 있습니다 전에 선언 공공을 추가하여 사용자가 SpawnMyPlayer 기능을 공개해야하는 방식으로

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

: 코드에서

순수한 C#이되도록 코드를 리팩터링하는 동안 가치가 있다고 생각하십시오. 네가 그렇게하지 않으면 너에게 고통 스러울거야. –

+0

어쩌면 좋은 생각이지만, 모든 자습서는 항상 자바 스크립트에 있습니다. –

+0

플레이어 개체를 파괴하는 대신 플레이어의 위치를 ​​다시 지정하고 플레이어의 상태를 기본 respawn 상태로 재설정합니다. 왜냐하면 그것보다 더 많은 가능성이 같은 인스턴스를 유지하기 위해 저렴합니다. Destroy를 사용하면 적과 아이템과 같은 더 많은 일회용 자산을 다룰 때 사용할 수 있습니다. – Terrance

답변

1

귀하의 문제가 Unity3d가 패스 C# 및 자바 스크립트를 컴파일과 관련이있다. 자바 스크립트 파일은 전에 C# 파일로 컴파일되므로 C# 클래스를 찾을 수 없습니다.

방법이 있습니다.

자산 폴더 내에 '플러그인'이라는 폴더를 만들고 C# 스크립트를 해당 폴더로 이동해야합니다. 자바 스크립트 파일보다 먼저 컴파일됩니다. 그리고 JS 스크립트가 이제 C# 스크립트를 참조 할 수 있어야합니다. 정말

public void SpawnMyPlayer(){ 
+0

정말 고마워, 나는 화합에 처음 왔어. 특히 모든 사람들이 도와 줘서 고맙다. –

+0

만족 스러우면 답을 알려주세요. – Rudolfwm

+0

그것은 일했다 그러나 나는 모든 것을 다시 쓰는 것을 끝냈다 C# –