Unity3d 新建xml 读取xml

在游戏开发中。Xml常常被用来作为技能配置、地图配置、人物动作配置等配置文件。

Unity3d内置的Xml库让我们非常方便地就能够新建Xml和读取Xml。

以下是一个样例,新建了一个Xml文档。而且读取它。

using UnityEngine;
using System.Collections;
using System.IO;
using System.Xml;
using System.Text;

public class XmlTest : MonoBehaviour {

    XmlElement m_roleMotions = null;//人物动作;
    XmlElement m_skills = null;//人物技能;

	// Use this for initialization
	void Start () {
        //CreateXml();
        //ReadXml();
        ReadFileToXml();
	}
	
	// Update is called once per frame
	void Update () {
	
	}

    void CreateXml()
    {
        string filepath = Application.dataPath + "/Resources/1013000.xml";
        if (!File.Exists(filepath))
        {
            //创建xml实例;
            XmlDocument xmlDoc = new XmlDocument();

            //创建character;
            XmlElement root = xmlDoc.CreateElement("character");

            /***创建roleMotions Start***/
            XmlElement roleMotions = xmlDoc.CreateElement("roleMotions");
            XmlElement motionInfo = xmlDoc.CreateElement("motionInfo");
            XmlElement motion = xmlDoc.CreateElement("motion");
            motion.SetAttribute("clipName", "enter_ready");
            motion.SetAttribute("isLoop", "false");
            motion.SetAttribute("moveEndTime", "0");
            motion.SetAttribute("moveStartTime", "0");
            motionInfo.AppendChild(motion);
            roleMotions.AppendChild(motionInfo);
            root.AppendChild(roleMotions);
            /***创建roleMotions End***/

            /***创建skills Start***/
            XmlElement skills = xmlDoc.CreateElement("skills");
            XmlElement skill = xmlDoc.CreateElement("skill");
            skill.SetAttribute("name", "普攻");
            skill.SetAttribute("motion", "RMT_Attack1");
            skills.AppendChild(skill);
            root.AppendChild(skills);
            /***创建skills End***/

            xmlDoc.AppendChild(root);

            xmlDoc.Save(filepath);
        }
        else
        {
            Debug.LogError("File hava exist");
        }
    }

    void ReadXml()
    {
        string filepath = Application.dataPath + "/Resources/1013000.xml";
        if (!File.Exists(filepath))
        {
            Debug.LogError("xml file not exist");
            return;
        }
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(filepath);

        //获取全部子节点;
        XmlNodeList nodeList = xmlDoc.SelectSingleNode("character").ChildNodes;
        foreach(XmlNode child in nodeList)
        {
            if (child.Name == "roleMotions")
            {
                m_roleMotions = child as XmlElement;
            }
            else if (child.Name == "skills")
            {
                m_skills = child as XmlElement;
            }
        }

        Debug.Log("m_roleMotions = " + m_roleMotions.InnerXml);
        Debug.Log("m_skills = " + m_skills.InnerXml);
    }

    void ReadFileToXml()
    {
        string filepath = "1013000";
        GameObject obj = Resources.Load(filepath) as GameObject;
        TextAsset xmlAsset = Resources.Load(filepath,typeof(TextAsset)) as TextAsset;

        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.LoadXml(xmlAsset.text);

        //获取全部子节点;
        XmlNodeList nodeList = xmlDoc.SelectSingleNode("character").ChildNodes;
        foreach (XmlNode child in nodeList)
        {
            if (child.Name == "roleMotions")
            {
                m_roleMotions = child as XmlElement;
            }
            else if (child.Name == "skills")
            {
                m_skills = child as XmlElement;
            }
        }

        Debug.Log("m_roleMotions = " + m_roleMotions.InnerXml);
        Debug.Log("m_skills = " + m_skills.InnerXml);
    }

}

新建的Xml文档内容例如以下:

<character>
  <roleMotions>
    <motionInfo>
      <motion clipName="enter_ready" isLoop="false" moveEndTime="0" moveStartTime="0" />
    </motionInfo>
  </roleMotions>
  <skills>
    <skill name="普攻" motion="RMT_Attack1" />
  </skills>
</character>

读取Xml结果:


<think>好的,用户问的是如何修改UnityPlayerActivity的入口文件。首先,我需要确定用户的需求是什么。可能他们在开发Unity项目时需要自定义Android的入口Activity,比如添加特定的权限、处理启动逻辑,或者集成第三方SDK。 用户之前的提问历史显示他们遇到了资源打包错误和样式引用的问题,可能他们现在在调整Android部分的配置。所以,用户可能已经有一定的Unity和Android开发经验,但遇到了具体问题需要解决。 接下来,我需要回忆Unity生成的Android项目结构。Unity默认生成的入口Activity是UnityPlayerActivity,位于com.unity3d.player包下。如果用户需要修改这个Activity,通常需要创建自己的Activity类,并继承UnityPlayerActivity,然后在AndroidManifest.xml中替换入口。 可能的步骤包括:导出Unity项目为Gradle项目,修改AndroidManifest.xml中的入口Activity,创建自定义的Activity类,处理UnityPlayer的初始化,以及可能的权限声明等。需要注意Unity版本差异,比如从Unity5到Unity2019之后的结构变化,是否使用AndroidX,以及如何保持UnityPlayer的正确引用。 用户可能遇到的常见问题包括类找不到、UnityPlayer无法启动、或者构建时的冲突。需要提醒他们检查包名是否正确,是否正确引用了Unity的类库,以及是否处理了正确的生命周期方法。 另外,用户可能需要知道如何在自定义Activity中调用Unity的方法,或者如何处理启动时的权限请求。例如,在onCreate方法中添加请求权限的代码,或者处理深度链接等。 还要考虑是否需要修改mainTemplate.gradle文件,以便在构建时包含必要的依赖或配置。比如,如果使用了AndroidX,需要确保gradle.properties中启用了AndroidX,并添加相应的迁移设置。 最后,需要确保用户了解修改后的构建流程,可能需要使用Android Studio重新构建APK,而不是直接通过Unity导出。同时,提醒他们备份原始文件,避免修改导致无法恢复的问题。 总结回答步骤:导出Unity项目,修改AndroidManifest,创建自定义Activity,处理UnityPlayer初始化,添加必要代码,调整gradle配置,构建APK。并给出示例代码和注意事项,如包名、权限、生命周期方法等。</think>以下是修改 **UnityPlayerActivity 入口文件** 的完整指南: --- ### 🔍 **修改原因** - **自定义入口逻辑**:添加启动权限、处理深度链接、集成第三方 SDK。 - **兼容性需求**:适配 Android 10+ 权限模型、AndroidX 迁移。 - **功能扩展**:在 Unity 启动前执行初始化代码(如热更新、数据解密)。 --- ### ✅ **修改步骤** #### 1. **导出 Unity Android 工程** - **操作**: Unity → `File > Build Settings > Android > Export Project` - 勾选 `Export Project`,生成可编辑的 Gradle 项目。 #### 2. **定位 UnityPlayerActivity** - **默认路径**: `unity_install_path/Editor/Data/PlaybackEngines/AndroidPlayer/Variations/mono/Release/Classes.jar` - 实际代码位于 `com.unity3d.player.UnityPlayerActivity`。 #### 3. **创建自定义入口类** - **操作**: 在 Android 项目中新建 Java/Kotlin 类,继承 `UnityPlayerActivity`: ```java // UnityPlayerActivity.java package com.yourcompany.yourgame; import com.unity3d.player.UnityPlayerActivity; import android.os.Bundle; public class CustomUnityPlayerActivity extends UnityPlayerActivity { @Override protected void onCreate(Bundle savedInstanceState) { // 🔍 在 Unity 初始化前添加自定义逻辑 requestPermissions(new String[]{"android.permission.READ_EXTERNAL_STORAGE"}, 1); super.onCreate(savedInstanceState); // ✅ Unity 初始化后可调用 UnityPlayer 方法 UnityPlayer.UnitySendMessage("GameManager", "OnAndroidInit", "Initialized"); } } ``` #### 4. **修改 AndroidManifest.xml** - **操作**: 替换入口 `Activity` 为自定义类: ```xml <!-- AndroidManifest.xml --> <application> <activity android:name=".CustomUnityPlayerActivity" <!-- 替换为你的类名 --> android:theme="@style/UnityThemeSelector"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> ``` #### 5. **添加必要权限** - **操作**: 在 `AndroidManifest.xml` 中声明所需权限: ```xml <!-- 示例:读取存储权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28"/> <!-- 适配 Android 10+ --> ``` #### 6. **适配 AndroidX** - **操作**: 如果使用 AndroidX,需修改 `gradle.properties`: ```properties # gradle.properties android.useAndroidX=true android.enableJetifier=true ``` #### 7. **构建 APK** - **操作**: 使用 Android Studio 构建签名 APK: `Build > Generate Signed Bundle/APK` --- ### 🧪 **完整示例** #### 1. **Java/Kotlin 自定义入口** ```java // CustomUnityPlayerActivity.java package com.yourcompany.yourgame; import com.unity3d.player.UnityPlayerActivity; import android.os.Bundle; import android.Manifest; import android.content.pm.PackageManager; import androidx.core.app.ActivityCompat; public class CustomUnityPlayerActivity extends UnityPlayerActivity { @Override protected void onCreate(Bundle savedInstanceState) { // 🔍 请求运行时权限 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1); } super.onCreate(savedInstanceState); } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { // ✅ 处理权限请求结果 if (requestCode == 1) { UnityPlayer.UnitySendMessage("GameManager", "OnPermissionResult", grantResults[0] == PackageManager.PERMISSION_GRANTED ? "Granted" : "Denied"); } } } ``` #### 2. **AndroidManifest.xml 配置** ```xml <!-- AndroidManifest.xml --> <manifest package="com.yourcompany.yourgame"> <uses-permission android:name="android.permission.INTERNET" /> <application> <activity android:name=".CustomUnityPlayerActivity" android:theme="@style/UnityThemeSelector"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> ``` --- ### 📌 **注意事项** - **包名一致性**:确保 `package="com.yourcompany.yourgame"` 与 Java/Kotlin 类的包名一致。 - **UnityPlayer 版本兼容性**:不同 Unity 版本的 `UnityPlayerActivity` 实现可能不同,避免直接修改 Unity 源码。 - **Android Studio 配置**: - Gradle 版本需与 Unity 兼容(如 Unity 2020.3 推荐使用 Gradle 6.8)。 - 启用 `multiDexEnabled true` 以避免方法数限制: ```gradle android { defaultConfig { multiDexEnabled true } } ``` --- ### ✅ **最终验证** 1. **构建 APK**: Android Studio → `Build > Build Bundle(s)/APK(s) > Build APK`. 2. **安装测试**: - 在设备上运行 APK,验证自定义逻辑是否生效(如权限弹窗、Unity 消息回调)。 3. **日志检查**: 使用 `Logcat` 监控 `CustomUnityPlayerActivity` 的生命周期事件。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值