前提・実現したいこと
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);
}
}
(関連ソースコード)
- 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(); } }
}
- 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アクションゲームの作り方」竹内大五郎
回答1件
あなたの回答
tips
プレビュー