質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

686閲覧

Unity Scoreが反映されない

jkoman

総合スコア17

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2019/06/12 07:36

編集2019/06/12 08:55

チュートリアルのサバイバルシューターをやっているのですがScoring points のとこで詰まりました。
敵をたおしてもスコアに反映されません。
動作として理解できないのがScoreManager.score += scoreValue;の部分でなぜGetComponentもせずにScoreManagerがインスタンスのように使えているのでしょうか?(自分は使えていませんが)

using UnityEngine; using UnityEngine.UI; using System.Collections; namespace CompleteProject { public class ScoreManager : MonoBehaviour { public static int score; // The player's score. Text text; // Reference to the Text component. void Awake () { // Set up the reference. text = GetComponent <Text> (); // Reset the score. score = 0; } void Update () { // Set the displayed text to be the word "Score" followed by the score value. text.text = "Score: " + score; } } }
using UnityEngine; 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); } }

試したこと

Debug.Log(ScoreManager.score);をStartSinking ()に追加してコンソールに値を表示したところ値は10でした
Debug.Log(ScoreManager.score);をプレイヤーが銃を撃った時に実行されるようにしたところ値は0、敵を倒した後だと10
Debug.Log(ScoreManager.score);をScoreManagerのUpdateに追加したところずっと0

エラー文?

コンソールに表示した値をダブルクリックすると表示される

InvalidOperationException: Cannot start process because a file name has not been provided. System.Diagnostics.Process.Start () (at <d465e2b2e5054d2787d6364114c43446>:0) (wrapper remoting-invoke-with-check) System.Diagnostics.Process.Start() UnityEditor.DefaultExternalCodeEditor.OpenProject (System.String path, System.Int32 line, System.Int32 column) (at C:/buildslave/unity/build/Editor/Mono/CodeEditor/DefaultExternalCodeEditor.cs:96) Unity.CodeEditor.CodeEditor.OpenFileAtLineColumn (System.String path, System.Int32 line, System.Int32 column) (at C:/buildslave/unity/build/Editor/Mono/CodeEditor/CodeEditor.cs:31) UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)
Exception thrown while invoking [OnOpenAssetAttribute] method 'Unity.CodeEditor.CodeEditor:OnOpenAsset (int,int,int)' : InvalidOperationException: Cannot start process because a file name has not been provided. System.Diagnostics.Process.Start () (at <d465e2b2e5054d2787d6364114c43446>:0) (wrapper remoting-invoke-with-check) System.Diagnostics.Process.Start() UnityEditor.DefaultExternalCodeEditor.OpenProject (System.String path, System.Int32 line, System.Int32 column) (at C:/buildslave/unity/build/Editor/Mono/CodeEditor/DefaultExternalCodeEditor.cs:96) Unity.CodeEditor.CodeEditor.OnOpenAsset (System.Int32 instanceID, System.Int32 line, System.Int32 column) (at C:/buildslave/unity/build/Editor/Mono/CodeEditor/CodeEditor.cs:62) UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

public static int score;

staticがつくと、グローバル変数のように使うことができます
「静的メンバー」で調べてみてください。

予想なんですが、scoreValue の値がInspector上で0の値で上書きされてたりしないでしょうか?
一度、ScoreManager.score += 10; と書いて実行してみてください

投稿2019/06/12 07:45

izmktr

総合スコア2856

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jkoman

2019/06/12 08:21 編集

ゲーム実行時のscoreValueの値をInspector上で確認しましたが10でした ScoreManager.score += 10; と書いて実行しましたが変化はありませんでした。 自分が考えてた原因はScoreManagerのインスタンスがみつからずどこを参照すればいいかわからないから変更されないと思っていたのですがstaticだとこの記述で大丈夫なようですね
izmktr

2019/06/12 08:41

だとすると、StartSinking が呼び出されてないんでしょうね Debug.Logを仕込んで、この関数が呼ばれているか確認してみてください
jkoman

2019/06/12 08:59

やってみましたが追記した通り表示されました。なぜかScoreManagerだけが影響されてません
izmktr

2019/06/12 09:03

ScoreManager.scoreの値をDebug.Logで出して変化を見てください もし毎回0に初期化されているようなら、score2みたいに自作の変数を使ってみるといいかもしれません
jkoman

2019/06/12 09:10

えーと、ScoreManager内で変化をつけて表示すればよいのでしょうか?Updateに score += 1;をつけたところコンソール画面には1,2,3,4,5,,,,と表示されました。自分のクラス内の変化はうけつけるようです
izmktr

2019/06/12 09:17

静的メンバーの挙動に疑いを持っているようですが、前述したとおりグローバル変数のようなものです たとえ外部からでも変化を受けます ・score2の提案は、scoreが別のクラスで毎フレーム初期化している可能性の対策 ・scoreを表示する部分がScoreManager.scoreの値を書き換えても変化しない可能性 このあたりを調べてみてください
jkoman

2019/06/12 09:52

2に変えても0のままでした。 現状はプレイヤーが弾をうつときとScoreManagerにScore2の価を表示させているのですがそれぞれ10と0ということなる値を表示します
izmktr

2019/06/12 10:01

「10と0ということなる値を表示します」の部分をもうちょっと詳細にほしいです 私の考えでは、ScoreManager.score の値の確認方法に問題があり、Debug.Logでの表示以外は信用できません ScoreManager.score を書き換えれば画面のスコアの値が変わるというところが勘違いで、最初だけは反映されるものの、途中で書き換えても画面の値はそのままになっている、という状態ではないでしょうか
jkoman

2019/06/12 10:22

追記の通りで銃をうつというメソッドの中にDebug.Log(ScoreManager.score2);をいれました。これで常時score2の値を表示するScoreManagerのUpdateと任意で表示させる銃を撃つメソッド(プレイヤーの子にもたせてる)があるのですが敵を倒した後左クリックで銃を撃つと10と表示されますがUpdateのほうは常時0を表示しています
jkoman

2019/06/12 11:38

一度ファイルを削除してから復元したらなおりました。教えていただいた確認法をもとに原因を考えてみたいと思います
jkoman

2019/06/12 12:10

原因がわかりました。チュートリアルの完成品のファイルをアタッチしてて敵側からは本来アタッチする予定のファイルにアクセスしてたため今回のようなことになっていました。Visual Studioのファイルがごちゃごちゃになっていたせいで完成品とそうでないのの区別がつかずどちらもscore2にしてしまったため気づけませんでした。これは完全に自分のミスなので申し訳ないです。 変数名をかえるというアプローチはとてもよいものだと感じました、お付き合いいただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問