2013-04-16 14:36:58 denghaofa 阅读数 2569


1、Unity3D开发程序员开发好场景后,打包apk包,将此apk包发给android开发人员

2、android开发人员将得到的apk包后缀名改为.zip(即重命名将.apk改为.zip)

3、解压步骤2得到的.zip包,得到文件夹

4、使用Eclipse新建android工程包,打开步骤3中得到的文件夹,将assets文件夹和lib文件夹复制到android工程包目录

5、导入jar包,右键工程属性,java build path-》添加jar到library,Unity安装目录\Editor\Data\PlaybackEngines\androidplayer\bin\classes.jar

6、将需要显示Unity3D场景的Activity实现如下,如果需要,请代码添加android自带界面

7、根据Unity3D提供的接口,更换场景,并根据生命周期完成整个项目,指的是除了Unity3D部分

mUnityPlayer = new MyPlayer(this, handler);
  int glesMode = mUnityPlayer.getSettings().getInt("gles_mode", 1);
  boolean trueColor8888 = false;
  mUnityPlayer.init(glesMode, trueColor8888);
  View playerView = mUnityPlayer.getView();

红色部分代码是获取Unity场景界面,拿到界面了,剩下的操作就靠程序员,动态添加在某个布局视图下,或者隐藏,或者。。。

 

 

import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;

public class UnityPlayerActivity extends Activity
{
	private UnityPlayer mUnityPlayer;

	// UnityPlayer.init() should be called before attaching the view to a layout. 
	// UnityPlayer.quit() should be the last thing called; it will terminate the process and not return.
	protected void onCreate (Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		mUnityPlayer = new UnityPlayer(this);
		int glesMode = mUnityPlayer.getSettings().getInt("gles_mode", 1);
		boolean trueColor8888 = false;
		mUnityPlayer.init(glesMode, trueColor8888);
		View playerView = mUnityPlayer.getView();
		setContentView(playerView);
		playerView.requestFocus();
	}
	protected void onDestroy ()
	{
		super.onDestroy();
		mUnityPlayer.quit();
	}

	// onPause()/onResume() must be sent to UnityPlayer to enable pause and resource recreation on resume.
	protected void onPause()
	{
		super.onPause();
		mUnityPlayer.pause();
		if (isFinishing())
			mUnityPlayer.quit();
	}
	protected void onResume()
	{
		super.onResume();
		mUnityPlayer.resume();
	}
	public void onConfigurationChanged(Configuration newConfig)
	{
		super.onConfigurationChanged(newConfig);
		mUnityPlayer.configurationChanged(newConfig);
	}
	public void onWindowFocusChanged(boolean hasFocus)
	{
		super.onWindowFocusChanged(hasFocus);
		mUnityPlayer.windowFocusChanged(hasFocus);
	}

	// Pass any keys not handled by (unfocused) views straight to UnityPlayer
	public boolean onKeyDown(int keyCode, KeyEvent event)
	{
		return mUnityPlayer.onKeyDown(keyCode, event);
	}
	public boolean onKeyUp(int keyCode, KeyEvent event)
	{
		return mUnityPlayer.onKeyUp(keyCode, event);
	}
}

 操作顺序

1、
 
2、
3、
4、
5、
本人Unity3D安装目录及获取文件路径
 
E:\Editor\Data\PlaybackEngines\androidplayer\bin
 
其实就是参考了Unity提供的如下文件夹中的源码
E:\Editor\Data\PlaybackEngines\androidplayer\src\com\unity3d\player
2013-01-21 21:00:55 wxg694175346 阅读数 9617

学习Unity脚本推荐:Unity3D官网索引


首先一点,你要确保有一个想要跳转的目标场景。在本案例中,目标场景是ending。

第一步:创建一个碰撞体,放置在需要的触发场景跳转的位置



第二步:删除多余的脚本,并且新建自己的脚本:



第三步:查阅相关文档,具体网址参见上篇博文:



第四步:将如下代码复制到你的脚本中:

// loadLevel.js
// This is used to load a level set in the inspector

var level:String; // Then anything you type will not be run

function Update () {
}

function OnTriggerStay (theCollider : Collider) {
	Application.LoadLevel (level);
}


第五步:此时再将Inspector面板中的level字符串改成ending:


这样做的好处是不用每次都新建脚本文件实现跳转,一个脚本就实现了跳转功能。



2019-08-13 22:43:12 piai9568 阅读数 155

在Project窗口中点击模型,可以在Preview窗口中进行预览(见下图),但是场景却不能预览。当项目中有比较多的场景,而场景中内容多的时候,我们需要双击每一个打开它才能查看内容,比较耗时。

今天我们来实现一下类似3D物体预览的 场景预览。
当单击场景的时候,可以直接快速的在Inspector中显示他们的内容。
效果如下:

创建一个ScenePreview.cs文件,将下面代码复制进去。完整代码如下:

using System.IO;
using UnityEngine;
using UnityEditor;
using UnityEngine.SceneManagement;
using System.Linq;

[CustomEditor(typeof(SceneAsset))]
[CanEditMultipleObjects]
public class ScenePreview : Editor
{
    const string PreviewFolders = "_scenes"; //你可以修改为你自己的路径,用来存放场景缩略图
    static bool _shouldRefreshDatabase;

    [RuntimeInitializeOnLoadMethod]
    public static void CaptureScreenshot()
    {
        var previewPath = GetPreviewPath(SceneManager.GetActiveScene().name);
        var dir = Path.GetDirectoryName(previewPath);
        if (!Directory.Exists(dir))
        {
            Directory.CreateDirectory(dir);
        }

        Debug.LogFormat("Saving scene preview at {0}", previewPath);
        ScreenCapture.CaptureScreenshot(previewPath);
        Debug.LogFormat("Scene preview saved at {0}", previewPath);

        _shouldRefreshDatabase = true;
    }

    public override void OnInspectorGUI()
    {        
        if (_shouldRefreshDatabase)
        {
            AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate);
            _shouldRefreshDatabase = false;
        }

        var sceneNames = targets.Select(t => ((SceneAsset)t).name).OrderBy(n => n).ToArray();

        var previewWidth = 200;
        var previewHeight = 200;

        for (int i = 0; i < sceneNames.Length; i++)
        {
            DrawPreview(i, sceneNames[i], previewWidth, previewHeight);
        }
    }

    void DrawPreview(int index, string sceneName, float width, float height)
    {
        var previewPath = GetPreviewPath(sceneName);
        var preview = Resources.Load(sceneName) as Texture;

        if (preview == null)
        {
            EditorGUILayout.HelpBox(string.Format(
                "还没有场景{0}的预览图{1}. 请切换到这个场景然后点击播放,会自动生成该场景的缩略图",
                sceneName,
                previewPath),
                MessageType.Info);
        }
        else
        {
            GUILayout.Button(preview,GUILayout.Width(width),GUILayout.Height(height));
        }
    }

    static string GetPreviewPath(string sceneName)
    {
        return string.Format("{0}/{1}/Resources/{2}.png", Application.dataPath, PreviewFolders, sceneName);
    }
}

基本原理就是当运行一个场景的时候,给这个场景截一张图,然后当选中时在Inspector中显示截图。

2018-08-10 11:38:31 Aa85641826 阅读数 680

      在项目开发过程中,UI要求脚本变量的命名与UI场景中的Gamobejct的名字保持一致,以达到开发的时候,容易迅速确认错误,(比如在寻在一个Button点击事件时,变量名与场景中的名字不一致,会导致我知道这个Button被点击,Text的被赋值的,但是在场景中如果名称不一样,找起来相当麻烦,确认问题会很浪费时间)。

      在命名的基础上,我做了一个功能,主要是通过反射,获取对应UI预设的与继承Mon脚本的中名称与类型相同的UI脚本中的变量,进行快速赋值,节省时间,不用在完成对应UI脚本编写以后,一个一个拖上去。自动完成,前提是,命名必须符合上面说道的规则。

using System;
using System.Reflection;
using UnityEngine;
using System.Collections.Generic;

public class BindAbleMonoBehaviour : MonoBehaviour {
    /// <summary>[ContextMenu("TestSetVar")]
    /// 该特性 可以 在Unity->Inspector面板右键弹出菜单添加一个按钮。
    /// 点击触发下面的方法 快速对已经定义的变量进行赋值
    /// </summary>
    [ContextMenu("Bind Property")]
    void BindProperty()
    {
        Bind(this);//使用工具类对当前选中对象进行 变量赋值
    }

    public static void Bind(MonoBehaviour targetMonoBhv)
    {
        //反射遍历一个类的属性,参照文章:https://www.cnblogs.com/cuihongyu3503319/archive/2011/11/04/2235634.html
        CacheGameObjet cacehGmObj = new CacheGameObjet(targetMonoBhv);
        Type t = targetMonoBhv.GetType();
        //注意, 目标类的变量必须要设置了get 和set方法的属性,反射才能获得该属性
        FieldInfo[] propertyList = t.GetFields();
        List<string> strX = new List<string>();
        foreach (FieldInfo item in propertyList)
        {
            //作用于排除继承于MonoBehaviour,MonoBehaviour 的自带 变量
            if (item == null)
            {
                Debug.Log("挂载的脚本未赋值");
            }

            //对下面这个鞋类型不去检测与获取
            if (item.FieldType == typeof(float) ||
                item.FieldType == typeof(int) ||
                item.FieldType == typeof(double) ||
                item.FieldType == typeof(double) ||
                item.FieldType == typeof(Vector2) ||
                item.FieldType == typeof(Vector3) ||
                item.FieldType == typeof(Vector4) ||
                item.FieldType == typeof(Sprite) ||
                item.FieldType == typeof(Enum) ||
                item.FieldType == typeof(Quaternion) ||
                item.FieldType == typeof(Rect) ||
                item.FieldType == typeof(AnimationCurve)
                )
            {
                continue;
            }

            Transform gmObj = cacehGmObj.GetObj(item.Name);//从子对象里面找名字相同的对象。
            if (gmObj == null)
            {
                Debug.Log("<color=red>请注意,这个变量没有赋值(不存在此名字的Object)!!这个变量:[" + item.Name + "]</color>");
                continue;
            }

            if (gmObj != null)
            {
                Type monobhv = item.FieldType;//.GetType();
                if (item.FieldType == gmObj.gameObject.GetType())
                {
                    if (item.GetValue(targetMonoBhv) == null)
                    {
                        strX.Add("Type:" + gmObj.gameObject.GetType() + " Name:<color=green>" + item.Name + "</color>");
                    }
                    item.SetValue(targetMonoBhv, gmObj.gameObject);//给变量赋值
                    continue;
                }
                object tagertObject = gmObj.GetComponent(monobhv);
                if (tagertObject != null)
                {
                    if (item.GetValue(targetMonoBhv) == null)
                    {
                        strX.Add("Type:" + monobhv + "  Name:<color=green>" + item.Name + "</color>");
                    }
                    item.SetValue(targetMonoBhv, tagertObject);//给变量赋值
                }
                else
                {
                    Debug.Log("<color=red>请注意,这个变量没有赋值!!这个变量:[" + item.Name + "]1.有对应的GameObject,但是没有想要的组件:" + monobhv.ToString() + "</color>");
                }
            }
        }
        Debug.Log("赋值列表数:" + strX.Count + "\n");
        for (int i = 0; i < strX.Count; i++)
        {
            Debug.Log(strX[i] + "\n");
        }


    }
    }

    public struct CacheGameObjet
    {
        public Transform[] allChilds;
        public CacheGameObjet(MonoBehaviour parent)
        {
            allChilds = parent.GetComponentsInChildren<Transform>();
        }

        /// <summary>从子对象里查找 指定Name  的 对象并返回
        /// </summary>
        /// <param name="nameX"></param>
        /// <returns></returns>
        public Transform GetObj(string name)
        {
            for (int i = 0; i < allChilds.Length; i++)
            {
                if (allChilds[i].name.ToUpper() == name.ToUpper())
                {
                    return allChilds[i];
                }
            }
            return null;
        }
    }

 

如果想使用此方法,把原来继承自MonoBehaviour,改为BindAbleMonoBehaviour

使用右键

会自动对场景此UI脚本与添加上对应的Gameobject

这个问题很简单,

博文 来自: u014313341
没有更多推荐了,返回首页