untiy Strip Code 使用填坑

本文详细解析了Unity在不同版本中使用StripEngineCode选项精简代码时遇到的崩溃问题,包括iOS平台上的资源加载崩溃及解决方案,以及Unity2017新增的strippinglevel功能对安卓项目的影响。通过添加特定类到link.xml文件,可以避免由代码剪裁引起的错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 第一次遇见坑是在5.x ios平台上  unity提供了Strip Engine Code 选项用于剪裁代码精简代码量

通过assetbundle 加载资源时(加载不是下载 载入场景时)  游戏崩溃 ,后面只知道是该选项造成但不知如何处理,只能关闭改选项

2 第二次遇见是在2017.x 新项目再次崩溃 通过ios xcode 打印日志 :ReportException: UnityLogError Could not produce class with ID xxx.

知道崩溃原因是找不 该类   被strip 剔除掉了  在https://docs.unity3d.com/Manual/ClassIDReference.html 上查找到id对应的类  发现是一个多边形碰撞体类被剔除了 

解决方法只需要将查表找到的Class加入到link.xml即可。

link.xml 格式

3 unity2017 新增了 stripping level 功能 导致安卓项目 也出现了加载资源时游戏崩溃的问题

用 4.0版本的小米 连 eclipse 查看打印日志  在日志里搜索 class with ID 找到 unity输出的错误信息 找到对应类 处理方法同上

 

 

找到一篇关于 Unity中使用Strip的总结 算是网上找的写的很细很全的:https://www.jianshu.com/p/e7120f025281

 

好的,接下来我会逐行解释上面提供的 Python 脚本的主要部分,并详细介绍每一部分的作用。由于整个脚本较长,我们将重点关注关键的部分和核心功能实现。 ### 主要模块导入 ```python import asyncio import subprocess from datetime import timedelta, datetime import matplotlib.pyplot as plt from threading import Thread import time import re # 导入库用于生成 excel 表格 import pandas as pd ``` - **`asyncio`**: 异步 I/O 和并发工具包。 - **`subprocess`**: 创建新进程并连接它们的输入/输出流。 - **`datetime`, `timedelta`**: 时间处理相关的函数,用来设定超时时间和记录开始与结束的时间戳。 - **`matplotlib.pyplot`**: 数据可视化的库,主要用于绘制折线图。 - **`Thread`**, **`time`**: 线程管理和延时控制。 - **`re`**: 正则表达式匹配库,帮助解析命令行输出中的特定文本。 - **`pandas`**: 提供高效的 DataFrame 对象来存储和操作结构化数据,并支持快速导出为 Excel 文件。 ### 定义 CommandExecutor 类 ```python class CommandExecutor: def __init__(self): self.cmds = ["ping www.baidu.com", "ipconfig", "dir"] # 存储待执行的三个 CMD 指令 ``` - 构造函数初始化了一个字符串列表 `cmds`,其中包含了三条示例性的命令(你可以替换成你需要的实际命令)。 #### 异步执行单个命令的方法 (`run_cmd`) ```python async def run_cmd(self, cmd_index): process = await asyncio.create_subprocess_shell( self.cmds[cmd_index], # 获取对应索引处的命令 stdout=subprocess.PIPE, # 将标准输出重定向到管道中 stderr=subprocess.STDOUT # 标准错误也一并发送给stdout ) while True: line = (await process.stdout.readline()).decode('gbk').strip() if not line: # 当没有更多输出时退出循环 break print(f"Cmd {cmd_index}: {line}") # 实时打印来自每个命令的结果 match = re.search(r'Reply\s+from\s+(\S+)\:', line) if match and len(match.groups()) > 0: ip_address = match.group(1).strip() # 示例性地处理从“Ping”命令获取的信息 return_code = await process.wait() # 等待直到子进程中止返回状态码 ``` - 使用 `asyncio.create_subprocess_shell()` 非阻塞方式启动命令行程序,并将其输出直接传递回主程序。 - 循环读取每次命令产生的每一条消息(`readline`)直至无新的内容为止。 - 解析包含 IP 地址的日志行作为示范;根据实际情况调整正则表达式的模式以适应你要抓取的数据特征。 #### 绘制动态图形的方法 (`plot_data`) ```python def plot_data(self, data_points): x_values = list(range(len(data_points))) y_values = [point['value'] for point in data_points] plt.plot(x_values, y_values) # 添加数据系列到图表上 plt.xlabel("Time") plt.ylabel("Value") plt.title("Dynamic Data Plotting Example") plt.show(block=False) # 显示非阻挡窗口 ``` - 接收一个由字典组成的序列 `data_points`,每个元素代表一段时间内的测量值。 - 计算横坐标(时间轴)与纵坐标(数值)之间的映射关系,并更新当前显示的图像而不阻碍主线程继续执行其他任务。 ### 定义入口函数 (`main`) ```python def main(): executor = CommandExecutor() loop = asyncio.get_event_loop() tasks = [] try: start_time = datetime.now() end_time = start_time + timedelta(minutes=3) # 设定运行时间为三分钟 while datetime.now() < end_time: threads = [ Thread(target=lambda: loop.run_until_complete(executor.run_cmd(i))) for i in range(len(executor.cmds))] for t in threads: t.start() for t in threads: t.join(timeout=(end_time-datetime.now()).total_seconds()) sample_plot_data = [{'time': str(datetime.now()), 'value': n*n+n%7*89} for n in range(int((datetime.now()-start_time)/timedelta(minutes=1)))] executor.plot_data(sample_plot_data) df = pd.DataFrame.from_records([{ "IP Address": f"example_ip_{i}", "Data Value": i*i+i%7*89 } for i in range(len(sample_plot_data)) ]) writer = pd.ExcelWriter('output.xlsx', engine='xlsxwriter') df.to_excel(writer, sheet_name="Sheet1") writer.save() finally: loop.close() ``` - **创建实例**:首先实例化 `CommandExecutor` 并获得事件循环句柄。 - **设置计时器**:通过计算起始时间和目标截止时间确定整个程序的最大持续期限。 - **多线程调度**:在一个固定周期内重复执行所有已注册的任务——这里是以线程的形式启动各个命令的异步处理器。 - **收集样本点**:构造一批假想的数据集用于即时渲染曲线图;可以根据真实需求自定义这部分逻辑。 - **保存至Excel表**:将最新一轮得到的所有有效信息汇总起来转换成 Pandas 的DataFrame格式再转存为 .xlsx 文件。 - 关闭 EventLoop 释放资源防止泄露。 ### 入口检查与调用 ```python if __name__ == '__main__': main() ``` 这行代码表示如果该文件作为独立的应用被执行,则会自动触发 `main()` 函数的调用。 --- 希望以上详细的说明可以帮助您理解这个复杂但实用的小项目是如何一步步构建出来的。如果有任何疑问或是遇到具体的编程难题,请随时提问!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值