2017-10-13 12 views
0

私はサバイバルシューティングゲームを作っています。私はそれを作ろうとしています。敵を殺すとポイントに追加されます。スコアはハイスコアに追加され、プレイごとに保存されます。私はスコアを追加するためのスクリプトを持っているが、私は高いスコアを正しくしているとは思わない。誰かが私にこれを助けてくれますか?ユニティ - ハイスコアを作成するにはどうすればいいですか?

敵が死亡したときに追加する敵のヘルススクリプトです。 敵シンク機能に入っています。

public class EnemyHealth : MonoBehaviour 
{ 
    public int startingHealth = 100; 
    public int currentHealth; 
    public float sinkSpeed = 2.5f; 
    public int scoreValue = 10; 
    public AudioClip deathClip; 


    Animator anim; 
    AudioSource enemyAudio; 
    ParticleSystem hitParticles; 
    CapsuleCollider capsuleCollider; 
    bool isDead; 
    bool isSinking; 


    void Awake() 
    { 
     anim = GetComponent <Animator>(); 
     enemyAudio = GetComponent <AudioSource>(); 
     hitParticles = GetComponentInChildren <ParticleSystem>(); 
     capsuleCollider = GetComponent <CapsuleCollider>(); 

     currentHealth = startingHealth; 
    } 


    void Update() 
    { 
     if(isSinking) 
     { 
      transform.Translate (-Vector3.up * sinkSpeed * Time.deltaTime); 
     } 
    } 


    public void TakeDamage (int amount, Vector3 hitPoint) 
    { 
     if(isDead) 
      return; 

     enemyAudio.Play(); 

     currentHealth -= amount; 

     hitParticles.transform.position = hitPoint; 
     hitParticles.Play(); 

     if(currentHealth <= 0) 
     { 
      Death(); 
     } 
    } 


    void Death() 
    { 
     isDead = true; 

     capsuleCollider.isTrigger = true; 

     anim.SetTrigger ("Dead"); 

     enemyAudio.clip = deathClip; 
     enemyAudio.Play(); 
    } 


    public void StartSinking() 
    { 
     GetComponent <UnityEngine.AI.NavMeshAgent>().enabled = false; 
     GetComponent <Rigidbody>().isKinematic = true; 
     isSinking = true; 
     ScoreManager.score += scoreValue; 
     Destroy (gameObject, 2f); 
    } 
} 

しかし、私は二つの問題直面しています:私はゲームを再起動すると、私は敵を殺すときに、ハイスコアのテキストは、スコアテキスト

  • を交換スコアテキストが
  • が更新されない

    +1

    W

    次のようなものは、あなたが必要なものでなければなりませんあなたはそれを正しくやっていないと思いますか?このコードの問題は何ですか?あなたはより具体的で、コードをデバッグする際に気づいたことを示す必要があります – UnholySheep

    +0

    あなたの質問は何ですか?何が問題ですか?スコアを追加するコードはどこですか? – FCin

    +0

    ハイスコアを保存する方法がわかりません。私はスコアを追加するためのスクリプトを追加しました。 –

    答えて

    0

    ゲームの最後にハイスコアを保存するだけで、すべてのフレームのハイスコアを更新し続ける必要はありません。あなたはゲームの始めに最高得点を得て、ゲーム中にその値を使用してゲームが終わったときに最高得点の値を更新する

    highScoreに決して割り当てられたことはありません常に0テキストコンポーネントを公開してインスペクタに追加する方が簡単です。

    public class ScoreManager : MonoBehaviour 
    { 
    public static int score; 
    public static int highScore; 
    
    public Text scoreText; 
    public Text highScoreText; 
    
    void Awake() 
    { 
        score = 0; 
        highScore = PlayerPrefs.GetInt("High Score", 0); 
    
        highScoreText.text = "High Score: " + highScore; 
    } 
    void Update() 
    { 
        scoreText.text = "Score: " + score; 
        highScoreText.text = "High Score: " + highScore; 
        if (score > highScore) 
        { 
         highScoreText.text = "High Score: " + score; 
        } 
    } 
    } 
    

    次に、ゲームを終了するときは、ハイスコアを保存するコードを追加します。あなたのコメントに基づいて

    1

    私はゲームを停止し、再び再生すると、ハイスコアは 画面上にアップしています。私がプレイするときしかし、ハイスコアのテキストは、スコアのテキスト、 を置き換え、それは私が敵

    を殺すときにはありませんので、あなたが敵を殺すとき、あなたのスコアが増加しない理由があるアップカウントされません。あなたの敵が死ぬときにStartSinking()と呼んでください。私はその方法で見るようにあなたはあなたがStartSinking()Death()のどこかに呼び出しを追加する必要がありますScoreManager.score

    public void StartSinking() 
    { 
        GetComponent <UnityEngine.AI.NavMeshAgent>().enabled = false; 
        GetComponent <Rigidbody>().isKinematic = true; 
        isSinking = true; 
        ScoreManager.score += scoreValue; 
        Destroy (gameObject, 2f); 
    } 
    

    の値を変更するところとなります。

    void Death() 
    { 
        isDead = true; 
    
        capsuleCollider.isTrigger = true; 
    
        anim.SetTrigger ("Dead"); 
    
        enemyAudio.clip = deathClip; 
        enemyAudio.Play(); 
        StartSinking(); 
    } 
    
    0

    私はゲームを停止し、再び再生するときに、高いスコアは、画面上にあります。しかし、私がプレイするとき、ハイスコアのテキストは、スコアのテキストを置き換え、そして私はあなたのコード内で2 GetComponent<Text>()年代を持っている敵

    を殺すときにはカウントアップしません。同じコンポーネントを参照しているように見えるので、得点の高いテキストを上書きすることになります。それぞれのテキスト要素を保持する空のgameobjectを作成し、次にpublic Text scoreTextpublic Text highScoreTextを使用して、2つのゲームオブジェクトをUnityエディタのこの​​スクリプトの適切な場所にドラッグしてみてください。

    など。HeirarchyComponent

    さらに、実際にはハイスコアを更新していません。テキストコンポーネントは基礎となるスコア変数に依存するため、テキストから始めてハイスコア0のままにすることはできません。変数を更新し、それに基づいてテキストを更新する必要があります。そうしないと、テキストを開始できます高い得点を持つが、次に高いスコアが更新されていないので、次のUpdate()に即座に0に書き直される。

    Awake()に:

    // get high score from PlayerPrefs 
    highScore = PlayerPrefs.GetInt("High Score", 0); 
    

    Update()中:

    void Update() 
    { 
        scoreText.text = "Score: " + score; 
        if (score > highScore) 
        { 
         highScore = score; 
         // only update high score text when it actually changes 
         highScoreText.text = "High Score: " + highScore; 
        } 
    } 
    

    ゲームが終了したら:

    int originalHighScore = PlayerPrefs.GetInt("High Score", 0); 
    // compare current session's high score vs our recorded high score from prefs 
    if (highScore > originalHighScore) 
    { 
        PlayerPrefs.SetInt("High Score", highScore); 
    } 
    
    関連する問題