Unity实现简易的日志输出功能

在使用Unity中的Debug.Log()进行日志输出时很不方便,在打包出来的可执行文件中没有办法看到输出,所有就想自己实现一个简易的日志输出功能,可以输出到日志文件,因为能力实在是不够,所以有错误和不合理的地方,还请各位老师指点一下,谢谢啦

1.日志记录器接口

public interface ILogger
{
    void Log(string condition, string stackTrace, UnityEngine.LogType type);
}

2.日志文件记录器

using System;
using UnityEngine;
using System.IO;

public class FileLogger : ILogger
{
    private readonly string path;

    /// <summary>
    /// 构造方法
    /// </summary>
    /// <param name="isClear">是否清空原有的日志</param>
    public FileLogger(bool isClear = false)
    {
        switch (Application.platform)
        {
            case RuntimePlatform.Android:
                path = Path.Combine( Application.persistentDataPath,"log.txt");
                break;
            case RuntimePlatform.WindowsPlayer:
                path = Path.Combine(Application.dataPath, "log.txt");
                break;
            case RuntimePlatform.WindowsEditor:
                path = Path.Combine(Application.dataPath, "log.txt");
                break;
            case RuntimePlatform.IPhonePlayer:
                path = Path.Combine(Application.persistentDataPath, "log.txt");
                break;
            case RuntimePlatform.OSXEditor:
                break;
            default:
                break;
        }

        if (isClear)
        {
            if (File.Exists(path))
            {
                File.Delete(path);
            }
        }
    }

    public void Log(string condition, string stackTrace, LogType type)
    {
        using (StreamWriter sw = new StreamWriter(path, true, System.Text.Encoding.UTF8))
        {
            string msg = string.Format("[{0}] {1}: {2}\n{3}", GetNowTime(), type, condition, stackTrace);
            sw.WriteLine(msg);
        }
    }


    #region Tool Method
    private string GetNowTime()
    {
        return DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
    }
    #endregion
}

3.日志系统管理类 

using System;
using UnityEngine;

public class LogSys
{
    private static ILogger logger;
    public static ILogger Logger
    {
        get { return logger; }
    }

    public bool IsOpen
    {
        get { return Debug.unityLogger.logEnabled; }
    }

    private LogSys() { }

    /// <summary>
    /// 初始化
    /// </summary>
    /// <param name="_logger">日志输出器</param>
    /// <param name="isOpen">是否开启日志输出</param>
    public static void  Init(ILogger _logger, bool isOpen = true)
    {
        Init(isOpen);
        logger = _logger;
        Enable();
    }

    public static void Init(bool isOpen = true)
    {
        Debug.unityLogger.logEnabled = isOpen;
    }

    /// <summary>
    /// 过滤器
    /// </summary>
    /// <param name="logType">需要显示的日志类型</param>
    public static void Filter(LogType logType = LogType.Log)
    {
        Debug.unityLogger.filterLogType = logType;
    }
    
    public static void Enable()
    {
        if (logger != null)
        {
            Application.logMessageReceived += logger.Log;
        }
    }
    
    public static void Disable()
    {
        if (logger != null)
        {
            Application.logMessageReceived -= logger.Log;
        }

    }
}

4.测试 

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.UI;

public class Test : MonoBehaviour
{
    public Text logText;

    void Awake()
    {
        LogSys.Init(new FileLogger());
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Q))
        {
            Debug.Log("My name is Blinkedu.");
        }

        if (Input.GetKeyDown(KeyCode.W))
        {
            Debug.LogWarning("My name is Blinkedu.");
        }

        if (Input.GetKeyDown(KeyCode.E))
        {
            Debug.LogError("My name is Blinkedu.");
        }
    }

    private void OnDestroy()
    {
        LogSys.Disable();
    }
}

 

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个Unity脚本,用于实现视锥形可视域分析绘制效果: ```csharp using UnityEngine; public class VisualAnalysis : MonoBehaviour { public float viewDistance = 10f; // 可视距离 public float viewAngle = 60f; // 可视角度 private Transform player; // 玩家的Transform组件 private Vector3 raycastOffset; // 射线检测的偏移量 private Mesh mesh; // 可视范围的网格 private Vector3[] vertices; // 可视范围的顶点数组 private int[] triangles; // 可视范围的三角形数组 void Start() { // 获取玩家的Transform组件 player = GameObject.FindGameObjectWithTag("Player").transform; // 设置射线检测的偏移量 raycastOffset = new Vector3(0, player.GetComponent<Collider>().bounds.size.y / 2, 0); // 创建可视范围的网格 mesh = new Mesh(); GetComponent<MeshFilter>().mesh = mesh; } void Update() { // 计算玩家和视野之间的距离 float distance = Vector3.Distance(transform.position, player.position); // 如果玩家在可视范围内,并且没有障碍物遮挡,则可见 if (distance <= viewDistance && IsVisible()) { Debug.Log("Player is visible!"); // 绘制可视范围的视锥体 DrawViewFrustum(); } } // 检测玩家是否可见 bool IsVisible() { // 计算玩家和视野之间的向量 Vector3 direction = player.position - transform.position; // 计算玩家和视野之间的角度 float angle = Vector3.Angle(direction, transform.forward); // 如果玩家在可视角度内,并且没有障碍物遮挡,则可见 if (angle <= viewAngle / 2) { RaycastHit hit; if (Physics.Raycast(transform.position + raycastOffset, direction.normalized, out hit, viewDistance)) { if (hit.collider.gameObject.CompareTag("Player")) { return true; } } } return false; } // 绘制可视范围的视锥体 void DrawViewFrustum() { // 计算可视范围的顶点 float halfAngle = viewAngle / 2 * Mathf.Deg2Rad; float aspectRatio = GetComponent<Camera>().aspect; float height = viewDistance * Mathf.Tan(halfAngle); float width = height * aspectRatio; Vector3[] corners = new Vector3[4]; corners[0] = new Vector3(0, 0, 0); corners[1] = new Vector3(-width, height, viewDistance); corners[2] = new Vector3(width, height, viewDistance); corners[3] = new Vector3(0, 0, viewDistance); // 将顶点从局部坐标系转换到世界坐标系 for (int i = 0; i < corners.Length; i++) { corners[i] = transform.rotation * corners[i] + transform.position; } // 计算可视范围的三角形 vertices = new Vector3[4]; triangles = new int[6]; vertices[0] = transform.position; vertices[1] = corners[1]; vertices[2] = corners[2]; vertices[3] = corners[3]; triangles[0] = 0; triangles[1] = 1; triangles[2] = 2; triangles[3] = 0; triangles[4] = 2; triangles[5] = 3; // 更新可视范围的网格 mesh.Clear(); mesh.vertices = vertices; mesh.triangles = triangles; } } ``` 这个脚本会检测玩家是否在视野范围内,如果玩家在范围内并且没有障碍物遮挡,则会输出日志信息,并绘制可视范围的视锥体。在这个脚本中,使用了视锥体来表示可视范围,同时也可以通过修改可视距离和可视角度来调整可视范围。可视范围的绘制使用了Unity的Mesh功能,通过计算可视范围的顶点和三角形来实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值