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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

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

Q&A

解決済

1回答

3881閲覧

unity ビルド後バグ UI実装

ak_pger

総合スコア6

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

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

0グッド

0クリップ

投稿2019/08/25 03:46

編集2019/08/26 12:47

前提・実現したいこと

PlayerのCharacter Status (Script)のlast attack targetに敵のステータスが入らない。

発生している問題

参考書籍を用いて作成したゲームをビルドしたらコンソール上ではエラーのないバグ(?)が出ました。
ビルドするまでのテストではすべて正常に動作していたのですがビルド後のアプリで実装したはずの敵のUIが表示されなくなりました。またビルド後はテストでも出なくなりました。コード上では誤りはないようなのですが以下のif文の部分の処理が機能してないようです。

該当のソースコード

言語:C#
// 敵ステータスの描画.
void DrawEnemyStatus()
{
if (playerStatus.lastAttackTarget != null)
{
CharacterStatus target_status = playerStatus.lastAttackTarget.GetComponent<CharacterStatus>();
DrawCharacterStatus(
(baseWidth - enemyLifeBarRect.width) / 2.0f, 0f,
target_status,
enemyLifeBarRect,
enemyFrontLifeBarColor);
}
}

(関連ソースコード)

  1. CharacterStatus.cs:

using UnityEngine;
using System.Collections;

public class CharacterStatus : MonoBehaviour
{

//---------- 攻撃の章で使用します. ---------- // 体力. public int HP = 100; public int MaxHP = 100; // 攻撃力. public int Power = 10; // 最後に攻撃した対象. public GameObject lastAttackTarget = null; //---------- GUIおよびネットワークの章で使用します. ---------- // プレイヤー名. public string characterName = "Player"; //--------- アニメーションの章で使用します. ----------- //状態. public bool attacking = false; public bool died = false; // 攻撃力強化 public bool powerBoost = false; // 攻撃強化時間 float powerBoostTime = 0.0f; // 攻撃力強化エフェクト ParticleSystem powerUpEffect; // アイテム取得 public void GetItem(DropItem.ItemKind itemKind) { switch (itemKind) { case DropItem.ItemKind.Attack: powerBoostTime = 5.0f; powerUpEffect.Play (); break; case DropItem.ItemKind.Heal: // MaxHPの半分回復 HP = Mathf.Min(HP + MaxHP / 2, MaxHP); break; } } void Start() { if (gameObject.tag == "Player") { powerUpEffect = transform.Find("PowerUpEffect").GetComponent<ParticleSystem>(); } } void Update() { if (gameObject.tag != "Player") { return; } powerBoost = false; if (powerBoostTime > 0.0f) { powerBoost = true; powerBoostTime = Mathf.Max(powerBoostTime - Time.deltaTime, 0.0f); } else { powerUpEffect.Stop(); } }

}

  1. CharacterStatusGui.cs:

using UnityEngine;
using System.Collections;

public class CharacterStatusGui : MonoBehaviour
{
float baseWidth = 854f;
float baseHeight = 480f;

// ステータス. CharacterStatus playerStatus; Vector2 playerStatusOffset = new Vector2(8f, 80f); // 名前. Rect nameRect = new Rect(0f, 0f, 120f, 24f); public GUIStyle nameLabelStyle; // ライフバー. public Texture backLifeBarTexture; public Texture frontLifeBarTexture; float frontLifeBarOffsetX = 2f; float lifeBarTextureWidth = 128f; Rect playerLifeBarRect = new Rect(0f, 0f, 128f, 16f); Color playerFrontLifeBarColor = Color.green; Rect enemyLifeBarRect = new Rect(0f, 0f, 128f, 24f); Color enemyFrontLifeBarColor = Color.red; // プレイヤーステータスの描画. void DrawPlayerStatus() { float x = baseWidth - playerLifeBarRect.width - playerStatusOffset.x; float y = playerStatusOffset.y; DrawCharacterStatus( x, y, playerStatus, playerLifeBarRect, playerFrontLifeBarColor); } // 敵ステータスの描画. void DrawEnemyStatus() { if (playerStatus.lastAttackTarget != null) { CharacterStatus target_status = playerStatus.lastAttackTarget.GetComponent<CharacterStatus>(); DrawCharacterStatus( (baseWidth - enemyLifeBarRect.width) / 2.0f, 0f, target_status, enemyLifeBarRect, enemyFrontLifeBarColor); } } // キャラクターステータスの描画. void DrawCharacterStatus(float x, float y, CharacterStatus status, Rect bar_rect, Color front_color) { // 名前. GUI.Label( new Rect(x, y, nameRect.width, nameRect.height), status.characterName, nameLabelStyle); float life_value = (float)status.HP / status.MaxHP; if(backLifeBarTexture != null) { // 背面ライフバー. y += nameRect.height; GUI.DrawTexture(new Rect(x, y, bar_rect.width, bar_rect.height), backLifeBarTexture); } // 前面ライフバー. if(frontLifeBarTexture != null) { float resize_front_bar_offset_x = frontLifeBarOffsetX * bar_rect.width / lifeBarTextureWidth; float front_bar_width = bar_rect.width - resize_front_bar_offset_x * 2; var gui_color = GUI.color; GUI.color = front_color; GUI.DrawTexture(new Rect(x + resize_front_bar_offset_x, y, front_bar_width * life_value, bar_rect.height), frontLifeBarTexture); GUI.color = gui_color; } } void Awake() { PlayerCtrl player_ctrl = GameObject.FindObjectOfType(typeof(PlayerCtrl)) as PlayerCtrl; playerStatus = player_ctrl.GetComponent<CharacterStatus>(); } void OnGUI() { // 解像度対応. GUI.matrix = Matrix4x4.TRS( Vector3.zero, Quaternion.identity, new Vector3(Screen.width / baseWidth, Screen.height / baseHeight, 1f)); // ステータス. DrawPlayerStatus(); DrawEnemyStatus(); }

}

試したこと

ビルドする前の段階でサウンドの実装があり、実装前の段階のものをビルドすると表示されました。そこで表示されなくなったもののサウンドに関するコンポーネントを無効化してテストしてみましたが、表示されませんでした。
サウンドを実装するとビルドで不具合が起こることはあるのでしょうか?
回答お願い致します。

補足情報(FW/ツールのバージョンなど)

unity 4.3.3

参考書籍:「オンライン3Dアクションゲームの作り方」竹内大五郎

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

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

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

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

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

Ram.Type-0

2019/08/25 10:02

playerStatusの定義もlastAttackTargetの定義も記載されていないので、これだと何もわかりません。 あと、Unity4.3.3は既にサポートが終了している5年半前のバージョンであり、Unity5で大きく破壊的変更が入ったので新規開発、及び学習に使うには全く向いていません。今から使うなら学習目的にせよUnity2018.4かUnity2019.2が良いと思います。
ak_pger

2019/08/26 14:33 編集

unity2018.4にアップグレードしましたがプロジェクトを開くとスクリプトのコンパイルエラーが出てテスト出来ません。unity4からunity5での変更で書き方を変えないといけない部分があるとわかり、調べながら試しているのですがなかなか解決できません。 エラー文は以下の通りです。 エラー "現在のコンテキストに 'AttackAreas' という名前は存在しません。" 該当ファイル AttackAreaActivator.cs using UnityEngine; using System.Collections; public class AttackAreaActivator : MonoBehaviour { Collider[] attackAreaColliders; // 攻撃判定コライダの配列. public AudioClip attackSeClip; AudioSource attackSeAudio; void Start () { // 子供のGameObjectからAttackAreaスクリプトがついているGameObjectを探す。 AttackArea[] GetAttackAreas = GetComponentsInChildren<AttackArea>(); attackAreaColliders = new Collider[GetAttackAreas.Length]; for (int attackAreaCnt = 0; attackAreaCnt < GetAttackAreas.Length; attackAreaCnt++) { //AttackAreaスクリプトがついているGameObjectのコライダを配列に格納する. attackAreaColliders[attackAreaCnt] = AttackAreas[attackAreaCnt].collider; attackAreaColliders[attackAreaCnt].enabled = false; // 初期はfalseにしておく. } // オーディオの初期化. attackSeAudio = gameObject.AddComponent<AudioSource>(); attackSeAudio.clip = attackSeClip; attackSeAudio.loop = false; } // アニメーションイベントのStartAttackHitを受け取ってコライダを有効にする void StartAttackHit() { foreach (Collider attackAreaCollider in attackAreaColliders) attackAreaCollider.enabled = true; // オーディオ再生. attackSeAudio.Play(); } // アニメーションイベントのEndAttackHitを受け取ってコライダを無効にする void EndAttackHit() { foreach (Collider attackAreaCollider in attackAreaColliders) attackAreaCollider.enabled = false; } } //AttackAreaスクリプトがついているGameObjectのコライダを配列に格納する. のすぐ下の attackAreaColliders[attackAreaCnt] = AttackAreas[attackAreaCnt].collider;の AttackAreasが定義されていない変数と出ているようなのですが、unity4の時には attackAreaColliders[attackAreaCnt] = attackAreas[attackAreaCnt].collider; で正常だったので関数を定義するのではなく、書き方の問題だと考えておりますが調べてもわからずにいます。 ご協力いたただければと思います。回答お願い致します。
ak_pger

2019/08/26 15:34

すみません、上記のコンパイルエラーですが解決できました。 GetAttackAreaとなっていたのをattakAreasにすることで正常に実行されるようになりました。 しかし依然CharacterStatusGui.csの敵ステータスの描画・if文の処理が行われません。
退会済みユーザー

退会済みユーザー

2019/09/01 06:52

あの・・・コードはしっかりそれ専用のがあるのでそちらを使ってもらえると回答する側も助かります。見やすくもなるので。
ak_pger

2019/09/01 09:53

失礼いたしました、心がけます。
guest

回答1

0

自己解決

質問文で関連ソースコードとして挙げたCharacterStatus.csやCharacterStatusGui.csに要因はなく、AttackArea.csというプレイヤーの攻撃判定を作るのに使ったスクリプトに攻撃した対象の値を保存する処理の記述が無いためでした。そのためプレイヤーの武器オブジェクトに値が敵のステータスが保存されずにCharacterStatusGui.csのif文のplayerStatus.lastAttackTargetに値が入ってない状態になっていました。

<CharacterStatusGui.cs>
C#

中略
// 敵ステータスの描画.
void DrawEnemyStatus()
{
if (playerStatus.lastAttackTarget != null)
{
CharacterStatus target_status = playerStatus.lastAttackTarget.GetComponent<CharacterStatus>();
DrawCharacterStatus(
(baseWidth - enemyLifeBarRect.width) / 2.0f, 0f,
target_status,
enemyLifeBarRect,
enemyFrontLifeBarColor);
}
}

''' <AttackArea.cs> C#         ・・・ // (プレイヤーの攻撃が敵に)当たった. void OnTriggerEnter(Collider other) { // 攻撃が当たった相手のDamageメッセージをおくる. other.SendMessage("Damage",GetAttackInfo()); // 攻撃した対象を保存. status.lastAttackTarget = other.transform.root.gameObject; ・・・ } 情報提示に至らない点が多くご不便おかけしましたが、 対応していただいた方々、ありがとうございました。

投稿2019/09/01 10:53

ak_pger

総合スコア6

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問