2016-04-01 19:53:07 skylin19840101 阅读数 6191

C#端的处理

C#调用其他模块的接口都是通过DllImport的方式来实现的。

首先导入名字空间


using System.Runtime.InteropServices;


声明需要使用的C接口

[DllImport("__Internal")]
private static extern void __init (string appid);

[DllImport("__Internal")]
private static extern void __setVersion (string version);


iOS库的处理

在iOS的工程中定义相应的C接口,并导出


#ifdef __cplusplus
extern "C" {
#endif   
    
    extern void __init(const char *appId);
    
    extern void __setVersion(const char *version);
    
#ifdef __cplusplus
}
#endif

注意:unity调用Xcode封装的函数,声明时需要用extern "C";


但在实际的使用过程中,遇到一个奇怪的问题:

在OC SDK中,定义了一个 __setUseTestAddr()接口



U3d工程中使用如下:



但在unity3d工具中运行的时候,总是提示找不到方法的错误


如果直接build成xcode工程,又能正常运行。

经过查找资料,以及请教同事,终于发现问题的所在,需要添加一个真机平台的判断,因为调用的是iOS的静态库,必须在iPhone环境下才能运行,直接在U3D工具中跑是不行的

#if UNITY_IPHONE || UNITY_IOS
	if(Application.platform == RuntimePlatform.IPhonePlayer){
		__setUseTestAddr(true);
	}
#endif


2016-09-21 10:12:14 sinat_23079759 阅读数 1910

最近在学unity3d,有一章讲到了协程和调用函数,讲讲我的心得。

注意:协程是一种伪线程。

调用函数与重复调用函数可以看做是协程的简化写法。协程可以自己定义间隔时间重复运行一段逻辑,而调用函数和重复调用函数则是固定时间。

所以说,调用函数更方便,协程更专业。

他们是有一定区别的:

1,协程定义较复杂,但使用灵活。

2,协程使用非固定的间隔时间,调用函数与重复调用函数使用固定的间隔时间。


注意:停止调用函数和停止协程要使用特定函数,他们不会自动停止。

停止协程:StopCoroutine(“协程名”);和StopAllCoroutines();

停止重复调用函数:CancelInvoke(“重复调用函数名”);


协程与调用函数的具体使用方法代码如下:

using UnityEngine;
using System.Collections;


public class 调用函数与协程 : MonoBehaviour {


// Use this for initialization
void Start () {
        //查看协程将调用函数注释,查看调用函数将协程注释


        #region 协程
        print("开始一个程序");
        StartCoroutine("xiecheng");
        print("结束一个程序");
        #endregion


        #region 调用函数
        //5秒后调用
        //Invoke("invoke",1f);//不重复 一秒后调用
        //InvokeRepeating("diaoyonghanshu", 2f, 0.5f);//两秒后调用函数并间隔0.5秒重复调用
        #endregion
    }

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

}


    #region 协程函数
    IEnumerator xiecheng()
    {
        //等待一秒
        yield return new WaitForSeconds(1f);
        print("开启另一个程序");
        yield return new WaitForSeconds(2f);
        print("等了两秒开启另一个程序");
    }
    #endregion


    #region 调用函数
    //void invoke()
    //{
    //    print("1s后调用 调用函数 不重复!");
    //}
    //void diaoyonghanshu()
    //{
    //    print("每隔一定时间调用 调用函数 重复!");
    //}
    #endregion
}


2016-10-31 19:58:25 sinat_23079759 阅读数 3213
大家在做游戏的过程中可能都会遇到这样的情况:很多类,很多物体,都需要使用同一个方法来实现相同功能,就像c#或其他编程语言中的静态类那样使用。那么unity 3d有没有这样的功能呢?答案是当然有了。
先简单介绍一下静态类:

静态类要使用static修饰符,如果一个类是静态类,那么不需要实例化这个类,就可以从外部直接访问这个类中public和static修饰的方法和变量,静态类中静态的变量可以被其他类访问和修改。


对于unity 3d中,静态类可以使用public 修饰,表示从外部包可以访问这个类,也可以什么也不写,直接static修饰类名。但是其中需要被外部直接访问的方法或变量必须使用public 和static修饰,否则提示没有权限或访问错误。而要注意的是,静态类内部使用的变量或方法也必须使用static关键字修饰,也就是说静态类中的所有变量和方法都需要使用static修饰。

在其他类调用静态类中的方法只需要在在前边写  静态类名.静态类可供外部调用的方法名  或者  静态类名.静态类可供外部调用的变量名  就可以了。

下面使用c#脚本来举例说明:
按照下面步骤进行操作:
1,在项目视图中的assets中创建一个c#脚本,命名为Allfun
2,继续创建脚本,命名为Test
3,打开这两个脚本

4,Allfun内写这些代码

static class Allfun    //这里public static class Allfun 或者static class Allfun 都可以
{ 
    public static string name= "Allfun_变量";//静态变量 供外部访问
    public static int add(int a,int b)//静态方法 供外部访问
    {
        return a + b;
    }

    static string neibubianliang = "修改前的文字";//静态变量,只供内部访问,外部访问不到,且不可以不写修饰符static
    static string change()//静态方法,只供内部访问,外部访问不到,且不可以不写修饰符static
    {
        return neibubianliang = "修改后的文字";
    }
    public static string after_change()//这个方法供外部访问,使用了静态类内的外部不能访问的方法change();
    {
        return change();
    }
}
5,Test中写以下代码
public class Test: MonoBehaviour {
    int a = 2, b = 4;
	// Use this for initialization
	 void Start () {
        Debug.Log(Allfun.name);//直接使用静态类中的变量
        Debug.Log(Allfun.add(a, b));//直接使用静态类中的方法
        Debug.Log(Allfun.after_change());//通过静态类中公有方法来使用静态类内部的不公有的方法和变量
        
    }
	
	// Update is called once per frame
	void Update () {
       
       
	}
}
6,保存并将Test赋予创建好的空Gameobject中,运行游戏可看到如下内容




2018-02-04 13:58:15 u014761712 阅读数 1038

1 静态类:
1. 不能继承Monobehaviour

2.不可以用在Unity 物体上 。

3.所有成员,变量函数等,都得是静态的。

4 静态类构造函数是静态的,并且私有的,可以用来初始化,数据。

使用 . 1.主要用来设计 帮助函数 比如sine ,cos 等 2. 数据保存。

调用顺序. 调用改静态的时候,构造函数自动调用一次。销毁这个静态在游戏退出的时候。

2016-12-21 15:46:28 ksgt00629518 阅读数 1253

最近博主在开发Unity在安卓上用蓝牙接收数据,数据形式比较特殊,属于高频低速的传输,所以在做这类蓝牙传输的时候效率比较低很容易断线,关于这个问题还在研究中,等研究完了补上博客,供小伙伴们参考。言归正传,Unity跟安卓的通信不外乎四点“Unity调用安卓静态方法”、“Unity调用安卓非静态方法”、“Unity调用安卓字段”“安卓调用Unity方法”。

jar包构建

Unity跟安卓Java代码通信的时候需要先构建jar包,需要用eclipse去打一个相应的jar包出来。此处附有eclipse下载地址:链接: http://pan.baidu.com/s/1boBa3cN 密码: h7dn 。
下载好后安装完成,里面自带AndroidSDK。网上好多导出Jar包的说明,在这里我们不再演示如何导出Jar包。

Unity调用安卓静态方法

在Jar包中的Java代码:

package com.example.bluetooth.glovescontrol;

import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;

public class MainActivity extends UnityPlayerActivity {
    public static int Add(int a,int b){
        int c = a + b;
        return c;
    }

Unity调用此方法的代码:

public void StartDiscovery()
    {
        AndroidJavaClass jc = new AndroidJavaClass ("com.example.bluetooth.glovescontrol.MainActivity ");【注解2int c = jc.CallStatic<int> ("Add", 1,2);【注解3】
        Debug.Log(c);
    }

注解2:
“com.example.bluetooth.glovescontrol”为包名,“MainActivity ”为类名
注解3:
在调用有返回值的安卓方法的时候一定要用接收相应的类型的方法如上面所示的“CallStatic< int>”,尖括号内的是泛型,需要填写的是Java代码返回值的类型,如果不用接收返回值的方法去调用Java有返回值类型的方法是会报错的。相应的如果调用的方法没有返回值,则不需要带尖括号以及尖括号内容的内容。

Unity调用安卓非静态方法

因为很多逻辑需要在Java端处理,所以有很多情况下是需要调用JAVA的非静态方法,在Unity里是这么调用的:


public void StartDiscovery()
    {
        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        jo = jc.GetStatic<AndroidJavaObject>("currentActivity");【注解4bool isReady = jo.Call<bool>("startDiscovery", true);【注解5】
    }

注解4:
其中”com.unity3d.player.UnityPlayer”与”currentActivity”是固定写法,不用因为项目改变而做任何修改。
注解5:
在调用有返回值的安卓方法的时候一定要用接收相应的类型的方法如上面所示的“Call< bool>”,尖括号内的是泛型,需要填写的是Java代码返回值的类型,如果不用接收返回值的方法去调用Java有返回值类型的方法是会报错的。相应的如果调用的方法没有返回值,则不需要带尖括号以及尖括号内容的内容。

安卓调用Unity方法

如果需要用到安卓调用Unity方法,则需要将安卓的classes.jar导入到eclipse中的bin文件夹下构建一下,并在Activity里继承“UnityPlayerActivity”,如下所示:

package com.gz.test;

import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;

public class MainActivity extends UnityPlayerActivity {

    public void Add(String a){
        【注解1】
        UnityPlayer.UnitySendMessage("Text","ShowOnText",a);
    }
}

注解1:
其中“UnityPlayer.UnitySendMessage”为Java调用Unity的方法,其各项参数代表如下所示:
“Text”为Unity中Hierarchy面板里面对象的名称;
“ShowOnText”为“Text”这个名称物体上所带脚本内的方法名;
“a”为传过去的参数,为String类型。

如果不需要安卓调用Unity则不需要继承UnityPlayerActivity ,且并不需要导入Classes.jar包,Unity直接调用方法即可。但是一般Unity跟安卓通信肯定是因为要调用安卓的一些功能,比如说震动、GPS、WiFi、蓝牙等等,此时一定要将eclipse工程中的”AndroidMainifest.xml”文件拖到Unity工程”Asstes/Plugins/Android”目录下,如果没有这个XML,如果仅仅做Unity-Android通信测试的时候,比如自己写一个简单的回调,去来回调是没有问题的,但是如果调用到安卓里面的功能了,则就会出问题。所以一定一定要在测试的时候也将这个文件放到Unity里!

安卓包一旦改变横竖屏就崩溃问题的解决办法:

"AndroidMainifest.xml"这个XML非常重要,他负责Unity在安卓机上显示相关,以及版本信息等内容,如果遇到打出的Unity打出的安卓包一旦改变横竖屏就崩溃的情况,则是这个XML中少了
        android:configChanges="keyboardHidden|orientation|screenSize"

这样一句代码,将其添加在

  <application
  ...
      <activity
      ...
      android:configChanges="keyboardHidden|orientation|screenSize"//这个地方就可以
      >
  >

Unity3D调aar包

阅读数 530

待更新

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