2014-10-21 12:58:26 jiguangcanhen 阅读数 4336

关于Unity3D工程与android工程的转换与合并,请参考我的另外一篇博客,如果你对Unity3D工程加入到android工程的过程不熟悉,也请先看完下面这篇博客:

android与Unity3D交互,fragment显示unity3d视图。

下面,我们来说说本博客的终端,Unity3D调用android的方法:

1.首先,在网络上大家可以看到很多把android project打包,然后以插件的方式,放入Unity3D工程中来调用的方式,这种方式,我不做评论,但是很麻烦,所以我也没有进行尝试,大家有兴趣可以到网络上搜索一下看看。

2.如果讲Unity3D的project导出为android project然后进行再次开发的过程中,需要Unity3D调用android的方法,这个时候,再使用1中的方法,显然是不合适的。


那么我们要怎么样来做呢?分为下面几部分:

1.在初始化UnityPlayer的Activity中添加方法,如下:

/**
	 * 测试Unity调用Android的方法
	 */
	public void testMethod(String param){
		System.out.println("参数为:"+param);
	}

对于提供的方法,不可以进行UI操作,因为Unity3D对于android的UI线程来说,只是个子线程,如果要进行UI操作,可以使用Handler发消息。


2.在Unity工程中,利用c#文件来书写,Unity调用的代码:

public static void ActivateShareImage(string content)
    {
        if (Application.platform == RuntimePlatform.IPhonePlayer)
        {
            _PressButton3(content);
        }
        else if (Application.platform == RuntimePlatform.Android)
        {
            UISystem.Console("test method!");

            AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
            jo.Call("testMethod", "unity");
        }
        else
        { 
        
        }
    }
3,如果你已经有android项目了,那么就把新修改的Unity3D的项目导出为android project的,把新导出的project中的assets的文件夹,替换掉之前老的project中的,这样做的目的是更换Unity的改动,如果改动了其他的东西,也是这样更换的,但是如果你的assets文件夹下还有其他资源,请保留。

如果,你没有android项目,那么就把Unity3D的项目导出为android的project项目使用。


4.对于AndroidJavaClass这个类,以及它提供的方法,大家可以参考下面的网站:

AndroidJavaClass 安卓Java类


这样,就可以完成调用了,根本就不需要使用插件。关于android向Unity3D发送消息,日后会发博客叙述。

2014-11-21 21:49:53 asd237241291 阅读数 15608

原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 QQ群:【Unity3D(AR/VR) 334163814】【Unity3D(游戏) 119706192】 本文链接地址: 调用Android原生方法

1.设置权限

a.从Unity的安装目录(Editor\Data\PlaybackEngines\androidplayer)找到AndroidManifest.xml文件。
b.在Unity项目中,创建(Plugins\Android)文件夹,并将AndroidManifest.xml拖入。

c.编辑AndroidManifest文件,在<manifest></manifest>标签内添加所需的权限标签(<uses-permission android:name="" />)


2.获取Activity

//获取当前App的Activity
	public static AndroidJavaObject Current()
    {
        if (Application.platform == RuntimePlatform.Android)
            return new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity");
        else
            return null;
    }

	//获取指定包名的Activity
	public static AndroidJavaObject GetActivity(string package_name,string activity_name)
    {
        return new AndroidJavaClass(package_name).GetStatic<AndroidJavaObject>(activity_name);
    }

3.调用Android原生方法

// UI线程中运行
	public static void RunOnUIThread(AndroidJavaRunnable r)
    {
        Current().Call("runOnUiThread", r);
    }

	//获取包名
	public static string getPackageName()
    {
        return Current().Call<string>("getPackageName");
    }
	//讲解:call<返回值类型>("方法名");

	//设置 不自动锁屏
	public static void DisableScreenLock()
    {
        Current().Call<AndroidJavaObject>("getWindow")
            .Call("addFlags",128);
    }
	//讲解:call("方法名",参数1);

    // 获取内置SD卡路径
    public static string GetStoragePath()
    {
        if (Application.platform == RuntimePlatform.Android)
            return new AndroidJavaClass("android.os.Environment").CallStatic<AndroidJavaObject>("getExternalStorageDirectory").Call<string>("getPath");
        else
            return "d:/movie";
    } 
	//讲解:new AndroidJavaClass("全类名")  ---new一个Android原生类
	//讲解:CallStatic<返回类型>("方法名")  ---静态方法获取一个Android原生类型



2019-12-21 15:38:04 zhunju0089 阅读数 119

需求:制作一个鼠标中键移动缩放和鼠标右键旋转的功能(鼠标右键旋转可以自行改成鼠标左键旋转)

效果图:

1.新建一个名为Target的立方体cube

2.新建一个材质球 Yellow颜色的并挂载到Target立方体上

 

3.新建一个脚本 MatrixAction.cs

4.MatrixAction.cs代码

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

public class MatrixAction : MonoBehaviour
{
    [Header("操作对象")]
    /// <summary>
    /// 操作对象
    /// </summary>
    public Transform m_target;
    void Start()
    {
        isDown1 = false;
        isDown2 = false;
    }
    /// <summary>
    /// 右键是否按下 
    /// </summary>
    private bool isDown1;

    /// <summary>
    /// 中键是否按下
    /// </summary>
    private bool isDown2;
    void Update()
    {
        // 按下了鼠标中键
        if (Input.GetMouseButtonDown(1))
            isDown1 = true;
        // 抬起了鼠标中键
        if (Input.GetMouseButtonUp(1))
            isDown1 = false;
        // 按下鼠标右键
        if (Input.GetMouseButtonDown(2))
            isDown2 = true;
        // 抬起了鼠标右键
        if (Input.GetMouseButtonUp(2))
            isDown2 = false;
        // 缩放 Input.mouseScrollDelta.y
        m_target.localScale += Time.deltaTime * m_target.localScale * Input.mouseScrollDelta.y;
    }
    private void LateUpdate()
    {
        if (isDown1)
        {
            // 计算单位时间内鼠标的偏移量
            float x = Input.GetAxis("Mouse X");
            float y = Input.GetAxis("Mouse Y");
            Vector3 rot = new Vector3(y, -x, 0);
            float spd = 10; //速度
            m_target.Rotate(spd * rot, Space.World);
        }
        if (isDown2)
        {
            // 计算单位时间内鼠标的偏移量
            float x = Input.GetAxis("Mouse X");
            float y = Input.GetAxis("Mouse Y");
            float spd = 0.4f;   //速度
            m_target.Translate(spd * new Vector3(x, y), Space.World);
        }
    }
}

5.新建一个Script空物体并将脚本MatrixAction.cs挂载上去,然后将Target拖拽到脚本上

6.为了Hierarchy层次更加清晰,新建几个空物体分隔各个组件 (可忽略)

2015-05-16 14:14:34 cp790621656 阅读数 3233

前面介绍了在 Unity3d 中通过 Plugin 功能来调用 C++ DLL 中的函数 以及回调的使用方法,但最终目的还是让 Unity3d 中可以调用 Lua 脚本中的函数,现在来实现。

首先关注前面两篇文章:

1、Unity3d 调用C++ DLL (Win平台) 

2、Unity3d 调用 C++ DLL之 DLL回调Unity3d (C++ DLL回调 C#函数) 

文章转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn

掌握 Unity3d 中使用 C++ Plugin的方法才方便理解。

下面我们开始了。

文章转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn

编译Luajit

首先下载 Luajit

http://luajit.org/download.html

下载完毕之后,解压。

打开VS2012 (或其他版本) 命令行工具,定位到 src目录,执行 命令

msvcbuild
文章转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn
来编译 Luajit。

文章转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn

文章转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn

编译成功!


编译生成DLL

参考 Unity3d 调用C++ DLL (Win平台) 创建 C++ DLL项目,设置项目的包含目录 和引用目录 ,添加 Luajit 引用

文章转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn

然后添加代码文件

LuaDelegate.h

# define _DLLExport __declspec (dllexport) //标记为导出函数;

extern "C" long long _DLLExport dlltest();

extern "C" long long _DLLExport CallLua(char* path);

文章转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn

LuaDelegate.cpp

#include "LuaDelegate.h"

#include <src\lua.hpp>  
#include <iostream>  

/*打开Lua所需要的库*/  
#pragma comment(lib,"lua51.lib")  

extern "C"  
{  
#include <src\lua.h>  
#include <src\lualib.h>  
}  

long long dlltest()
{
		long long a = 1;
		int b = 0;
		while(b<1000000000)
		{
			a=a+1;
			b=b+1;
		}
		return a;
}

long long CallLua(char* path)  
{  
           lua_State *L=luaL_newstate(); /*创建一个解释器句柄*/  
           luaL_openlibs(L);             /*打开所有的Lua库*/  
              
            //luaL_loadfile(L,"script1.lua"); /*调入Lua脚本文件*/  
		   //luaL_dofile(L,"C:/script.lua");
		   luaL_dofile(L,path);

		   lua_getglobal(L,"test");

		   //lua_pushnumber(L,1);
		   //lua_pushnumber(L,2);

		   //lua_call(L,2,1);

		   lua_call(L,0,1);

		   long long result=lua_tonumber(L,-1);

            lua_close(L);       /*关闭句柄*/  

			return result;
}

生成解决方案。

编译成功后到 生成目录 找到生成的 DLL 文件。拖入到 Unity3d 项目中的 Assets/Plugins 目录中。

文章转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn

文章转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn

然后把 Lua 脚本文件放入到 指定 文件夹中。

文章转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn

Unity3d 脚本 调用 Lua 函数

创建 Unity3d 脚本

using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;

public class NewBehaviourScript : MonoBehaviour {

	[DllImport ("LuaDLL")]
	private static extern long dlltest();

	[DllImport ("LuaDLL")]
	private static extern long CallLua (string path);

	// Use this for initialization
	void Start () {
		Debug.Log (Application.dataPath);
	}


	void OnGUI()
	{
		if(GUI.Button(new Rect(100,100,200,200),"Test DLL"))
		{
			long before=System.DateTime.Now.Ticks;
			Debug.Log("dlltest="+ dlltest());
			Debug.Log("take "+(System.DateTime.Now.Ticks-before));
		}

		if(GUI.Button(new Rect(100,300,200,200),"Test Lua"))
		{
			long before=System.DateTime.Now.Ticks;
			Debug.Log("monotest="+ CallLua(Application.dataPath+"/LuaSource/script.lua"));
			Debug.Log("take "+(System.DateTime.Now.Ticks-before));
		}
		
		if(GUI.Button(new Rect(300,300,200,200),"Test Mono"))
		{
			long before=System.DateTime.Now.Ticks;
			Debug.Log("monotest="+ monotest());
			Debug.Log("take "+(System.DateTime.Now.Ticks-before));
		}
	}

	// Update is called once per frame
	void Update () {
	
	}

	long monotest()
	{
		long a = 1;
		int b = 0;
		while(b<1000000000)
		{
			a=a+1;
			b=b+1;
		}
		return a;
	}
}

在脚本中分别调用了 C++、Lua、Mono的同一功能的函数。用来做简单的娱乐性能测试,仅供娱乐。。

文章转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn

运行成功后:

文章转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn

示例工程下载:

http://download.csdn.net/detail/cp790621656/8706393

文章转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn

2012-11-28 13:22:54 xggllc 阅读数 5181

    这几天在写一个数字漫游项目,有一个要求是在高空鸟瞰,沿着固定的路径移动.........

    部分代码如下:C#代码,CameraMove.cs

using UnityEngine;
using System.Collections;
public class CameraMove : MonoBehaviour 
{
     int SpeedUp = 10;
     bool Automatic = true;
     Vector3 Goal = new Vector3(200,10,100);
     void Update ()
    {
       if(Automatic)
		{
			Speed = true;
			transform.position=Vector3.MoveTowards(transform.position,Goal,Time.deltaTime * SpeedUp);
		}
    }
}

主要是 这个 Vector3.MoveTowards当前的地点移向目标。

API 上没有具体介绍,

说是 “这个函数基本上和Vector3.Lerp相同,而是该函数将确保我们的速度不会超过maxDistanceDelta。maxDistanceDelta的负值从目标推开向量,就是说maxDistanceDelta是正值,当前地点移向目标,如果是负值当前地点将远离目标。”

第一个参数是 开始位置,第二个参数是 目标位置; 第三个参数 我理解为控制 移动速度与方向的;

上面代码中 SpeedUp 是为了控制 移动的速度的.......

上面代码拖动到摄像机上 ,就可以实现摄像机移动了......

貌似通过这个还可以设置按固定曲线轨迹移动,个人觉得可以通过一些逻辑判断来实现(PS:目前没要求曲线我就没有做测试)。

嘿嘿........小弟新手 ,希望大家多多指教~

                                                                                                                                                                                                                                                         破破

                                                                                                                                                                                                                                           2012年11月28日 13:02:44

void Update () { for(int i=0; i

博文 来自: weiming8517

unity 3d 鼠标旋转物体脚本

博文 来自: dickysun1987

unity3d实现3D物体上的点击事件

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