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

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

ただいまの
回答率

90.40%

  • JavaScript

    18136questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • C#

    8018questions

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

  • Unity

    4705questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Unity3D

    1535questions

    Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

  • Unity2D

    1038questions

Unity5で、ログが重複してしまいます。助けてください。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 904

van-0215

score 57

Unity5を使い自作ゲームを作っているのですが、Debug.logを表示について聞きたいことがあります。

現在複数のステージを作り1つ1つをつなげて1つのゲームを作成しようとしています。

ステージ1(Main)からステージ2(Stage2)に移動する際に画像にありますように左下にルール等を表示しています。

スタート直後のステージ1では、きれいに表示がされるのですが、ステージ1からステージ2に移る際に同じ文章が重複してしまいます。
初心者なものでして、なぜこのようになってしまうのかがわかりません。
重複をなくすにはどうしたらよいか、教えてください。お願いします。

なおこの表示に関しては、Assets Storeより"ScreenLogor"というものをインポートして使っています。

ステージ1
ステージ2

それぞれのスクリプトを下記に貼っていきます。※使用言語はC#です。

<枠と仕組み? ScreenLogger.cs>

using UnityEngine;
using System.Collections.Generic;

public class ScreenLogger : MonoBehaviour
{
    public enum LogAnchor
    {
        TopLeft,
        TopRight,
        BottomLeft,
        BottomRight
    }

    public bool IsPersistent = true;
    public bool ShowInEditor = true;

    [Tooltip("Height of the log area as a percentage of the screen height")]
    [Range(0.3f, 1.0f)]
    public float Height = 0.5f;

    [Tooltip("Width of the log area as a percentage of the screen width")]
    [Range(0.3f, 1.0f)]
    public float Width = 0.5f;

    public int Margin = 20;

    public LogAnchor AnchorPosition = LogAnchor.BottomLeft;

    public int FontSize = 14;

    [Range(0f, 01f)]
    public float BackgroundOpacity = 0.5f;
    public Color BackgroundColor = Color.black;

    public bool LogMessages = true;
    public bool LogWarnings = true;
    public bool LogErrors = true;

    public Color MessageColor = Color.white;
    public Color WarningColor = Color.yellow;
    public Color ErrorColor = new Color(1, 0.5f, 0.5f);

    public bool StackTraceMessages = false;
    public bool StackTraceWarnings = false;
    public bool StackTraceErrors = true;

    static Queue<LogMessage> queue = new Queue<LogMessage>();

    GUIStyle styleContainer, styleText;
    int padding = 5;

    public void Awake()
    {
        Texture2D back = new Texture2D(1, 1);
        BackgroundColor.a = BackgroundOpacity;
        back.SetPixel(0, 0, BackgroundColor);
        back.Apply();

        styleContainer = new GUIStyle();
        styleContainer.normal.background = back;
        styleContainer.wordWrap = true;
        styleContainer.padding = new RectOffset(padding, padding, padding, padding);

        styleText = new GUIStyle();
        styleText.fontSize = FontSize;

        if (IsPersistent)
            DontDestroyOnLoad(this);
    }

    void OnEnable()
    {
        if (!ShowInEditor && Application.isEditor) return;

        queue = new Queue<LogMessage>();

#if UNITY_4_5 || UNITY_4_6
        Application.RegisterLogCallback(HandleLog);
#else
        Application.logMessageReceived += HandleLog;
#endif
    }

    void OnDisable()
    {
        if (!ShowInEditor && Application.isEditor) return;

#if UNITY_4_5 || UNITY_4_6
        Application.RegisterLogCallback(null);
#else
        Application.logMessageReceived -= HandleLog;
#endif
    }

    void Update()
    {
        if (!ShowInEditor && Application.isEditor) return;

        while (queue.Count > ((Screen.height - 2 * Margin) * Height - 2 * padding) / styleText.lineHeight)
            queue.Dequeue();
    }

    void OnGUI()
    {
        if (!ShowInEditor && Application.isEditor) return;

        float w = (Screen.width - 2 * Margin) * Width;
        float h = (Screen.height - 2 * Margin) * Height;
        float x = 1, y = 1;

        switch (AnchorPosition)
        {
            case LogAnchor.BottomLeft:
                x = Margin;
                y = Margin + (Screen.height - 2 * Margin) * (1 - Height);
                break;

            case LogAnchor.BottomRight:
                x = Margin + (Screen.width - 2 * Margin) * (1 - Width);
                y = Margin + (Screen.height - 2 * Margin) * (1 - Height);
                break;

            case LogAnchor.TopLeft:
                x = Margin;
                y = Margin;
                break;

            case LogAnchor.TopRight:
                x = Margin + (Screen.width - 2 * Margin) * (1 - Width);
                y = Margin;
                break;
        }

        GUILayout.BeginArea(new Rect(x, y, w, h), styleContainer);

        foreach (LogMessage m in queue)
        {
            switch (m.Type)
            {
                case LogType.Warning:
                    styleText.normal.textColor = WarningColor;
                    break;

                case LogType.Log:
                    styleText.normal.textColor = MessageColor;
                    break;

                case LogType.Assert:
                case LogType.Exception:
                case LogType.Error:
                    styleText.normal.textColor = ErrorColor;
                    break;

                default:
                    styleText.normal.textColor = MessageColor;
                    break;
            }

            GUILayout.Label(m.Message, styleText);
        }

        GUILayout.EndArea();
    }

    void HandleLog(string message, string stackTrace, LogType type)
    {
        if (type == LogType.Assert && !LogErrors) return;
        if (type == LogType.Error && !LogErrors) return;
        if (type == LogType.Exception && !LogErrors) return;
        if (type == LogType.Log && !LogMessages) return;
        if (type == LogType.Warning && !LogWarnings) return;

        queue.Enqueue(new LogMessage(message, type));

        if (type == LogType.Assert && !StackTraceErrors) return;
        if (type == LogType.Error && !StackTraceErrors) return;
        if (type == LogType.Exception && !StackTraceErrors) return;
        if (type == LogType.Log && !StackTraceMessages) return;
        if (type == LogType.Warning && !StackTraceWarnings) return;

        string[] trace = stackTrace.Split(new char[] { '\n' });

        foreach (string t in trace)
            if (t.Length != 0) queue.Enqueue(new LogMessage("  " + t, type));
    }
}

class LogMessage
{
    public string Message;
    public LogType Type;

    public LogMessage(string msg, LogType type)
    {
        Message = msg;
        Type = type;
    }
}
<ステージ1用 Test.cs>
using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour
{
    float timeout = 5, lasttime = -1;
    int i = 0;

    void Start()
    {
        TestMessageTypes();
    }

    void TestMessageTypes()
    {
        Debug.Log("スタート地点に立ちました。");
        Debug.Log("ゴールを目指して頑張ってください");
        Debug.LogWarning("十字キーで移動できます。");
    }
}
<ステージ2用 Stage2.cs>
using UnityEngine;
using System.Collections;

public class Stage2 : MonoBehaviour
{
    float timeout = 5, lasttime = -1;
    int i = 0;

    void Start()
    {
        TestMessageTypes();
    }
    void TestMessageTypes()
    {
        Debug.Log("第2ステージです。");
        Debug.LogWarning("Spaceでジャンプできます。");
        Debug.LogWarning("助走が必要です。");
        ClearConsole();
    }

    static void ClearConsole() {
        var logEntries = System.Type.GetType("UnityEditorInternal.LogEntries,UnityEditor.dll");
        var clearMethod = logEntries.GetMethod("Clear", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);
        clearMethod.Invoke(null,null);
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

可能性があるとすれば……
・Stage2.csがシーン上に2つ存在している(複数のオブジェクトに付いているとか)
・clearMethodが悪さしている
上記のどちらかかと思います。

なお、これは余計なお世話かつ非常に今更感のある指摘なのですが……
Debug.Logをヘルプ用のテキスト表示に使うのはあまりよくないかと思います。(デバッグログを画面上で確認する為に表示させているなら分かりますが)
また、OnGUIは負荷が高く、実用には適しません。
uGUIと通常のstring変数(またはList<string>等)を用いた方が簡潔で安定性のあるコードになるかと思います。ご参考までに。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/23 13:30

    ご指摘の通りだと思いました。
    ありがとうございました。

    キャンセル

同じタグがついた質問を見る

  • JavaScript

    18136questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • C#

    8018questions

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

  • Unity

    4705questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Unity3D

    1535questions

    Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

  • Unity2D

    1038questions