如何编写chrome插件Unity原生插件

unity 编辑器和插件制作(四.2)
上次 我们讲述的是编辑器制作,怎么把图片加载到场景中,今天 我们就来讲述下,怎么 制作UIButton以及UIimage的互换。
废话不多说。进入正题。
首先我们要了解 unity的机制,button属性必须有的属性等。
首先 我们先说下 unity的机制:
unity中检测点击事件,使用NGUI的可能知道,NGUI使用的就是SendMessage的方式来进行事件的传递。没错,这也是 unity最为简便的方式,
(要注意一个问题哦,这个方式 如果 你要使用 大于 万次循环的话 会有延迟的哦,一般也不会同时发送万条事件的)。
我们知道了 事件的传送的方式,那么我们就开始制作这个规则,首先 要使用SendMessage的话我们要拿到gameobject的对象才能使用。
所以我们要想办法拿到点击的那个物体。怎么坐那,原理其实很简单,就是射线。我们都知道,unity的射线是用来探测使用的 正好,我们所有可以看到的物体都是存在camera下面,那么我们就可以使用,从camera上发射射线,来达到检测物体的作用,物体要有碰撞体哦。
先贴部分代码等这个章节完了我会贴完整的代码
Ray cameraR
Vector3 touchPos,pressOffS
public static GameObject touchObj =
public static VKCamera shareVkC
void Update () {
#if UNITY_EDITOR
if(Input.GetMouseButtonDown(0)){
onPressDown(Input.mousePosition);
}else if(Input.GetMouseButtonUp(0)){
onPressUp(Input.mousePosition);
}else if(Input.GetMouseButton(0)){
onDrag(Input.mousePosition);
#if UNITY_IPHONE || UNITY_ANDROID
if(Input.touchCount==1){
touch = Input.GetTouch (0);
switch(touch.phase){
case TouchPhase.Began:
onPressDown(touch.position);
case TouchPhase.Moved:
onPressUp(touch.position);
case TouchPhase.Ended:
case TouchPhase.Canceled:
onDrag(touch.position);
if(Input.GetMouseButtonDown(0)){
onPressDown(Input.mousePosition);
}else if(Input.GetMouseButtonUp(0)){
onPressUp(Input.mousePosition);
}else if(Input.GetMouseButton(0)){
onDrag(Input.mousePosition);
public void onPressDown(Vector2 vec){
touchPos =
for(int i=0 ; i&Camera.allCameras.Li++){
cameraRay = Camera.allCameras[i].ScreenPointToRay(touchPos);
if(Physics.Raycast(cameraRay,out hit,9999,Camera.allCameras[i].cullingMask) && touchObj == null){
touchObj = hit.transform.gameO
if(touchObj!=null && touchObj.GetComponent&VKButton&()){
touchPos = Camera.allCameras[i].ScreenToWorldPoint(touchPos);
pressOffSet =touchObj.transform.position-touchP
VKButton button = touchObj.GetComponent&VKButton&();
if(!iSNull(button.pressEventName) && button.eventObj!=null)
button.eventObj.SendMessage(button.pressEventName,button);
if(button.pressButtonTex!=null){
button.renderer.sharedMaterial.mainTexture = button.pressButtonT
if(button.isDrag && !iSNull(button.dragStartEventName)){
button.eventObj.SendMessage(button.dragStartEventName,vec);
if(button.isAni){
button.SendMessage(&onPressAni&);
public void onPressUp(Vector2 vec){
if(touchObj!=null){
VKButton button = touchObj.GetComponent&VKButton&();
if(button!=null){
if(button.buttonTex!=null){
touchObj.renderer.sharedMaterial.mainTexture =
touchObj.GetComponent&VKButton&().buttonT
if(!iSNull(button.clickEventName) && button.eventObj!=null){
button.eventObj.SendMessage(button.clickEventName,button);
if(button.isDrag && !iSNull(button.dragEndEventName)){
button.SendMessage(button.dragEndEventName,vec);
if(button.isAni){
button.SendMessage(&onClickAni&);
touchObj =
public void onDrag(Vector2 vec){
if(touchObj!=null){
VKButton button = touchObj.GetComponent&VKButton&();
if(button!=null && button.isDrag){
for(int i= 0;i&Camera.allCameras.Li++){
Vector2 worldVec =
Camera.allCameras[i].ScreenToWorldPoint(vec);
touchObj.transform.position = new Vector3(worldVec.x+pressOffSet.x,worldVec.y+pressOffSet.y,touchObj.transform.position.z);
if(!iSNull(button.dragEventName))
button.eventObj.SendMessage(button.dragEventName,worldVec);
bool iSNull(string eventName){
bool buttonIsNull =
if(eventName== null || eventName.Equals(&null&)){
buttonIsNull
return buttonIsN
这些是camera的部分,还有一点这个 我们没有贴我的适配方案 摄像机的适配方案,这里统配是的设计方案,因为这里我估计还要改下,发现这个摄像机适配方案,超出了unity的物理引擎的范围。不建议,不过可以参考。
public void initVKCamere(){
gameObject.name = &VKCamere&;
this.camera.orthographic =
this.camera.backgroundColor = Color.
this.camera.nearClipPlane = 0;
this.camera.farClipPlane = 9999;
this.camera.orthographic =
this.camera.orthographicSize = getCameraSize ();
this.transform.position = new Vector3(0,0,-1000);
this.transform.rotation = Quaternion.Euler(Vector3.zero);
this.transform.localScale = Vector3.
Application.targetFrameRate=60;
if(GetComponent&AudioListener&()){
//DestroyImmediate(GetComponent&AudioListener&());
int getCameraSize(){
int size = 384;
bool isLandscape=(Camera.main.pixelWidth&Camera.main.pixelHeight);
float rad = Camera.main.pixelWidth/Camera.main.pixelH
bool isIPad= (Mathf.Abs(rad-1.3333f)&0.001f) || (Mathf.Abs(rad-0.75f)&0.001f);
if(isIPad){
if(isLandscape){
if(isLandscape){
//iPhone 5
if(Camera.main.pixelHeight/Camera.main.pixelWidth&1.6){
camera的编辑器类
using UnityE
using UnityE
using System.C
[CustomEditor(typeof(VKCamera))]
public class VKCameraEditor : Editor {
public override void OnInspectorGUI (){
base.OnInspectorGUI();
VKCamera vkCamere = (VKCamera)
if(GUILayout.Button(&ReSetCamera&)){
vkCamere.initVKCamere();
EditorUtility.SetDirty(vkCamere);
EditorUtility.UnloadUnusedAssets();
好下面我们来讲述下,button的一些东西,其实就很简单了。只是在编辑器方面可能会有些麻烦。
说白了 就是button就来处理 摄像机发来的东西。虽然很简单的一句话,但我们写得东西还是有很多的。
依然,button还是继承前面的view
using UnityE
using System.C
using Holoville.HOT
//[RequireComponent(typeof(BoxCollider))]
public class VKButton : VKView {
[HideInInspector] public Material buttonDefultM
[HideInInspector] public Mesh buttonDefultM
[HideInInspector] public Texture buttonTex,pressButtonT
[HideInInspector] public string pressEventName =
[HideInInspector] public string clickEventName =
[HideInInspector] public string dragStartEventName =
[HideInInspector] public string dragEventName =
[HideInInspector] public string dragEndEventName =
[HideInInspector] public GameObject eventObj =
[HideInInspector] public string eventScript =
[HideInInspector] public bool isDrag =
[HideInInspector] public float scale = 1;
[HideInInspector] public string info=
[HideInInspector] public string[] animatorType = new string[]{&null&,&bigger&,&smaller&,&moveLeft&,&moveRight&};
[HideInInspector] public int currentAnimator = 0;
[HideInInspector] public bool isAni =
void Start () {
buttonDefultMat = new Material(Shader.Find(&VK/VKButtonShader&));
gameObject.GetComponent&MeshRenderer& ().material = buttonDefultM
buttonDefultMesh = new Mesh ();
gameObject.GetComponent&MeshFilter& ().mesh = buttonDefultM
if(GetComponent&BoxCollider&()== null)
gameObject.AddComponent&BoxCollider&();
updateButton();
public float setScale{
public void updateButton(){
if(buttonTex!=null){
if(buttonDefultMat!=null)
buttonDefultMat.mainTexture = buttonT
if(buttonDefultMesh!=null)
buttonDefultMesh.vertices = InitBase.initVertice(buttonTex.width *scale,buttonTex.height*scale,ancPointx,ancPointy);
if(this!=null&&gameObject.GetComponent&BoxCollider&()!=null){
gameObject.GetComponent&BoxCollider&().size = new Vector3(buttonTex.width*scale,buttonTex.height*scale,0);
if(buttonDefultMat!=null)
buttonDefultMat.mainTexture =
if(buttonDefultMesh!=null)
buttonDefultMesh.vertices = InitBase.initVertice(width*scale,height*scale,ancPointx,ancPointy);
gameObject.GetComponent&BoxCollider&().size = new Vector3(width,height,0);
if(buttonDefultMesh!= null){
buttonDefultMesh.triangles = InitBase.initTri ();
buttonDefultMesh.normals = InitBase.initNormal();
buttonDefultMesh.uv = InitBase.initUV();
Vector3 pressScale= Vector3.
Vector3 pressPos = Vector3.
Tweener tw =
void onPressAni(){
if(tw!=null && !tw.isComplete){
pressScale = transform.localS
pressPos = transform.
switch(currentAnimator){
tw = VKAnimator.scaleBy(gameObject,0.3f,Vector3.one*0.2f,VkAniDuration.AnimationCurve,null);
tw = VKAnimator.scaleBy(gameObject,0.3f,Vector3.one*-0.2f,VkAniDuration.AnimationCurve,null);
tw = VKAnimator.moveBy(gameObject,0.3f,new Vector3(-10f,0,0),false,VkAniDuration.AnimationCurve,null);
tw = VKAnimator.moveBy(gameObject,0.3f,new Vector3(10f,0,0),false,VkAniDuration.AnimationCurve,null);
void onClickAni(){
if(currentAnimator == 1 || currentAnimator==2){
VKAnimator.scaleTo(gameObject,0.3f,pressScale,VkAniDuration.AnimationCurve,null);
} else if(currentAnimator == 3 || currentAnimator==4){
VKAnimator.moveTo(gameObject,0.3f,pressPos,false,VkAniDuration.AnimationCurve,null);
public void switchImageView(){
VKImageView imgView = gameObject.AddComponent&VKImageView& ();
imgView.imgViewTex = buttonT
imgView.highLightedTex = pressButtonT
imgView.ancPointx = ancP
imgView.ancPointy = ancP
imgView.scale =
imgView.updateImageView ();
if(GetComponent&BoxCollider&()){
DestroyImmediate(GetComponent&BoxCollider&());
DestroyImmediate (GetComponent&VKButton&());
这里有个 动画效果 我是自己使用的hotween整合的一些东西,如果你想用自己的可以自己去做。hotween插件 我就不用公布了,可以去官网进行下载,各大论坛也有下载资源。
using UnityE
using System.C
using Holoville.HOT
public enum VkAniDuration{
AnimationCurve = EaseType.AnimationCurve,
EaseInBack=EaseType.EaseInBack,
EaseInBounce=EaseType.EaseInBounce,
EaseInCirc=EaseType.EaseInCirc,
EaseInCubic=EaseType.EaseInCubic,
EaseInElastic=EaseType.EaseInElastic,
EaseInExpo=EaseType.EaseInExpo,
EaseInOutBack=EaseType.EaseInOutBack,
EaseInOutBounce=EaseType.EaseInOutBounce,
EaseInOutCirc=EaseType.EaseInOutCirc,
EaseInOutCubic=EaseType.EaseInOutCubic,
EaseInOutElastic=EaseType.EaseInOutElastic,
EaseInOutExpo=EaseType.EaseInOutExpo,
EaseInOutQuad=EaseType.EaseInOutQuad,
EaseInOutQuart=EaseType.EaseInOutQuart,
EaseInOutQuint=EaseType.EaseInOutQuint,
EaseInOutSine=EaseType.EaseInOutSine,
EaseInQuad=EaseType.EaseInQuad,
EaseInQuart=EaseType.EaseInQuart,
EaseInQuint=EaseType.EaseInQuint,
EaseInSine=EaseType.EaseInSine,
EaseOutBack=EaseType.EaseOutBack,
EaseOutBounce=EaseType.EaseOutBounce,
EaseOutCirc=EaseType.EaseOutCirc,
EaseOutCubic=EaseType.EaseOutCubic,
EaseOutElastic=EaseType.EaseOutElastic,
EaseOutExpo=EaseType.EaseOutExpo,
EaseOutQuad=EaseType.EaseOutQuad,
EaseOutQuart=EaseType.EaseOutQuart,
EaseOutQuint=EaseType.EaseOutQuint,
EaseOutSine=EaseType.EaseOutSine,
Linear=EaseType.Linear
public class VKAnimator {
// public static Tweener moveTo(GameObject obj,float time,Vector3 target,bool isLocal,VkAniDuration vkDurType = VkAniDuration.AnimationCurve){
Tweener tw =
if(isLocal)
tw = startVkAnimote(obj,time,&localPosition&,target,vkDurType,null);
tw = startVkAnimote(obj,time,&position&,target,vkDurType,null);
public static Tweener moveTo(GameObject obj,float time,Vector3 target,bool isLocal,VkAniDuration vkDurType = VkAniDuration.AnimationCurve,VKAniComplete completeObj = null){
Tweener tw =
if(isLocal)
tw =startVkAnimote(obj,time,&localPosition&,target,vkDurType,completeObj);
tw = startVkAnimote(obj,time,&position&,target,vkDurType,completeObj);
public static Tweener moveBy(GameObject obj,float time,Vector3 offset,bool isLocal,VkAniDuration vkDurType = VkAniDuration.AnimationCurve,VKAniComplete completeObj = null){
Tweener tw =
if(isLocal){
Vector3 tLocalPos = obj.transform.localPosition +
tw = startVkAnimote(obj,time,&localPosition&,tLocalPos,vkDurType,completeObj);
Vector3 tPos = obj.transform.position +
tw = startVkAnimote(obj,time,&position&,tPos,vkDurType,completeObj);
public static Tweener scaleTo(GameObject obj,float time,Vector3 scale,VkAniDuration vkDurType = VkAniDuration.AnimationCurve,VKAniComplete completeObj = null){
Tweener tw =
tw = startVkAnimote(obj,time,&localScale&,scale,vkDurType,completeObj);
public static Tweener scaleBy(GameObject obj,float time,Vector3 offsetScale,VkAniDuration vkDurType = VkAniDuration.AnimationCurve,VKAniComplete completeObj = null){
Tweener tw =
Vector3 targetScale = obj.transform.localScale+offsetS
tw = startVkAnimote(obj,time,&localScale&,targetScale,vkDurType,completeObj);
public static Tweener routeTo(GameObject obj,float time,Vector3 routeEulerTarget,VkAniDuration vkDurType = VkAniDuration.AnimationCurve,VKAniComplete completeObj = null){
Tweener tw =
tw = startVkAnimote(obj,time,&localEulerAngles&,routeEulerTarget,vkDurType,completeObj);
public static Tweener routeBy(GameObject obj,float time,Vector3 routeEulerOffset,VkAniDuration vkDurType = VkAniDuration.AnimationCurve,VKAniComplete completeObj = null){
Tweener tw =
Vector3 target = obj.transform.localEulerAngles+ routeEulerO
tw = startVkAnimote(obj,time,&localEulerAngles&,target,vkDurType,completeObj);
//localEulerAngles
private static Tweener startVkAnimote(GameObject obj,float time,string key,object target,VkAniDuration vkDurType = VkAniDuration.AnimationCurve,VKAniComplete completeObj = null){
Tweener tw =
TweenParms twp = new TweenParms();
twp.Prop(key,target);
twp.Ease((EaseType)vkDurType);
if(completeObj!=null){
twp.OnComplete(completeObj.sendTargetObj,completeObj.methodName,completeObj.sendobj,SendMessageOptions.DontRequireReceiver);
HOTween.To(obj.transform,time,twp);
using UnityE
using System.C
public class VKAniComplete{
public GameObject sendTargetObj =
public string methodName =
public object sendobj =
public VKAniComplete(GameObject sendTargetObj,string methodName,object sendobj){
this.sendTargetObj = sendTargetO
this.methodName = methodN
this.sendobj =
下面就是button的编辑器方面了。ok,这里可能有点麻烦。不过还是可以解决的。
首先我们要获取脚本里面的方法怎么获取那。根据c#的MSDN的描述我们可以看到。就是以下方法,这就是 为什么 NGUI 只能找到public属性的方法。
using UnityE
using System.C
using System.R
public class GetPublic : MonoBehaviour {
static public
MethodInfo[] GetObjectMethods(string selectedObjClass){
if(selectedObjClass==null)
MethodInfo[] methodInfos=
if(System.Type.GetType(selectedObjClass)==null){
return methodI
methodInfos =
System.Type.GetType(selectedObjClass).GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
return methodI
这里就是button编辑器的一些属性的传递,和界面的修改哈。
using UnityE
using System.C
using UnityE
using System.R
[CustomEditor(typeof(VKButton))]
public class VKButtonEditor : Editor {
public override void OnInspectorGUI ()
int pressEventNum= 0;
int selectScriptNum = 0;
int clickEventNum = 0;
int dragStartEveNum = 0;
int dragEveNum = 0;
int dragEndEveNum = 0;
VKButton button = (VKButton)
button.buttonTex = EditorGUILayout.ObjectField (&Texture&,button.buttonTex,typeof(Texture),true)as T
button.pressButtonTex = EditorGUILayout.ObjectField (&PressButtonTex&,button.pressButtonTex,typeof(Texture),true)as T
button.eventObj = EditorGUILayout.ObjectField(&eventObj&,button.eventObj,typeof(GameObject),true) as GameO
= EditorGUILayout.TextField(&info&,);
button.ancPointx = EditorGUILayout.Slider(&AnchorX&,button.ancPointx,0.0f,1.0f);
button.ancPointy = EditorGUILayout.Slider(&AnchorY&,button.ancPointy,0.0f,1.0f);
if(button.buttonTex == null){
button.width=EditorGUILayout.IntField(&Width&,button.width);
button.height=EditorGUILayout.IntField(&Height&,button.height);
GUILayout.BeginHorizontal();
if(GUILayout.Button(&2X&)){
button.setScale = 0.5f;
if(GUILayout.Button(&1X&)){
button.setScale = 1f;
if(GUILayout.Button(&1.5X&)){
button.setScale = 0.75f;
GUILayout.EndHorizontal();
GUILayout.BeginHorizontal();
if(GUILayout.Button(&ChangeName&)){
if(button.buttonTex!=null){
button.name = button.buttonTex.
if(GUILayout.Button(&Switch ImageView&)){
button.switchImageView();
GUILayout.EndHorizontal();
if(button.eventObj!=null){
MonoBehaviour[] monoScriptArry =new MonoBehaviour[button.eventObj.GetComponents&MonoBehaviour&().Length+1];// button.eventObj.GetComponents&MonoBehaviour&();
for(int i=0;i&monoScriptArry.Li++){
if(i&monoScriptArry.Length-1)
monoScriptArry [i] = button.eventObj.GetComponents&MonoBehaviour&()[i];
if(i == monoScriptArry.Length-1){
monoScriptArry [i] =
if(monoScriptArry !=null&& monoScriptArry.Length&0){
string [] scriptName = new string[monoScriptArry.Length];
for(int i=0;i&scriptName.Li++){
if(monoScriptArry[i]!=null){
scriptName[i] = monoScriptArry[i].GetType().ToString();
if(scriptName[i].Equals(&VKCamera&)){
scriptName[i] = &null&;
scriptName[i] = &null&;
if(scriptName[i].Equals(button.eventScript)){
selectScriptNum =
selectScriptNum = EditorGUILayout.Popup(&EventScript&,selectScriptNum,scriptName);
button.eventScript = scriptName[selectScriptNum];
MethodInfo[] publicMethodA
if(button.eventScript == null || button.eventScript.Equals(&null&)){
publicMethodArry = new MethodInfo[1];
publicMethodArry = new MethodInfo[GetPublic.GetObjectMethods(button.eventScript).Length+1];
for(int i = 0;i&publicMethodArry.Li++){
if(i&publicMethodArry.Length-1){
publicMethodArry[i] =GetPublic.GetObjectMethods(button.eventScript)[i];
publicMethodArry[i] =
if(publicMethodArry!=null && publicMethodArry.Length&0){
string[] methodArry = new string[publicMethodArry.Length];
for(int i=0;i&methodArry.Li++){
if(publicMethodArry[i]!=null){
methodArry[i] = publicMethodArry[i].N
methodArry[i] =&null&;
if(button.pressEventName !=null && button.pressEventName.Equals(methodArry[i])){
pressEventNum =
if(button.clickEventName != null && button.clickEventName.Equals(methodArry[i])){
clickEventNum =
if(button.isDrag){
if(button.dragStartEventName != null && button.dragStartEventName.Equals(methodArry[i])){
dragStartEveNum =
if(button.dragEventName != null && button.dragEventName.Equals(methodArry[i])){
dragEveNum =
if(button.dragEndEventName != null && button.dragEndEventName.Equals(methodArry[i])){
dragEndEveNum =
pressEventNum = EditorGUILayout.Popup(&PressEvent&,pressEventNum,methodArry);
clickEventNum = EditorGUILayout.Popup(&ClickEvent&,clickEventNum,methodArry);
button.pressEventName = methodArry[pressEventNum];
button.clickEventName = methodArry[clickEventNum];
button.isAni = EditorGUILayout.Toggle (&ISAimator&,button.isAni);
if(button.isAni){
button.currentAnimator = EditorGUILayout.Popup(&ButtonAnimator&,button.currentAnimator,button.animatorType);
button.isDrag =
EditorGUILayout.Toggle (&ISDrag&,button.isDrag);
if(button.isDrag){
EditorGUILayout.LabelField(&---------------------------------------------&);
dragStartEveNum = EditorGUILayout.Popup(&DragStartEvent&,dragStartEveNum,methodArry);
dragEveNum = EditorGUILayout.Popup(&DragEvent&,dragEveNum,methodArry);
dragEndEveNum = EditorGUILayout.Popup(&DragEndEvent&,dragEndEveNum,methodArry);
button.dragStartEventName = methodArry[dragStartEveNum];
button.dragEventName = methodArry[dragEveNum];
button.dragEndEventName
=methodArry[dragEndEveNum];
pressEventNum = EditorGUILayout.Popup(&PressEvent&,pressEventNum,new string[]{&null&});
clickEventNum = EditorGUILayout.Popup(&ClickEvent&,clickEventNum,new string[]{&null&});
button.isAni =
button.isDrag =
button.updateButton ();
if(button!=null){
EditorUtility.SetDirty(button);
EditorUtility.UnloadUnusedAssets();
我这里扩展了一些功能,像移动啊,什么的。。其实还可以加一些功能的 ,这里只是学习。有兴趣的可以自己加些东西。
看过本文的人也看了:
我要留言技术领域:
取消收藏确定要取消收藏吗?
删除图谱提示你保存在该图谱下的知识内容也会被删除,建议你先将内容移到其他图谱中。你确定要删除知识图谱及其内容吗?
删除节点提示无法删除该知识节点,因该节点下仍保存有相关知识内容!
删除节点提示你确定要删除该知识节点吗?我想在unity里面写字
请问有什么办法或者有什么插件么?
如题 &求解。。。
要评论请先&或者&
有个Drawing Engine,看看是不是你需要的Unity3D编辑器插件教程_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Unity3D编辑器插件教程
上传于|0|0|暂无简介
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩1页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢Unity原生平台插件开发简介(Android/iOS)_Android开发_动态网站制作指南
Unity原生平台插件开发简介(Android/iOS)
来源:人气:86
一、Unity如何调用c#之外的语言的内容
1、c/c++可以编译成.so动态库(android平台下),.dll动态库(window平台和编辑器下),.a静态库(iOS平台下),.bundle包(Mac平台下和编辑器下)
& & & 把编译好的东西放在Plugins目录下的指定平台目录下即可。比如iOS平台就放在iOS文件夹下面。Android平台根据cpu架构不同放在对应文件夹下面,比如Anroid/libs/armeabi-v7a。 Window平台及编辑器一般放在x86_64目录下。
& & & 不同动态库可能有冲突,比如x86的动态库以及x86_64的动态库是互相冲突的,这个要在编辑器中设置各个库的对应平台是哪个。
2、iOS扩展也可以直接把.m或者.mm的源文件放在iOS目录下,Unity打包的时候会直接将其打包到xcode工程里面。这个跟编译好静态库是一样的。
3、Window平台的动态库可以用vs来编译,也可以用mingw来编译。如果是c99用的比较多的,推荐用mingw。比如tolua就是用这套来编译的。
4、Android平台的插件如果是的,推荐用Android Studio来编译。如果是c/c++的,推荐用ndk来编译。这个后面会详细介绍。
5、在c#中直接用DllImport即可直接使用对应函数,比如
#if UNITY_IOS
& & & &// iOS相关函数实现在.m文件中
[DllImport( &__Internal& )]
ivate static extern float _iOSSetBatteryMonitoringEnabled(); // 启用电量监控
#elif UNITY_ANDROID
& & & & // android相关函数用动态库封装调用
& & & & [DllImport(&NativePlugin&)]
& & & & private static extern int _AndroidCheckTemperature(); & // 检测温度
6、Android的java的部分,可以直接使用AndroidJavaClass来调用相应的函数,比如以下是获取Android系统电量的代码
using (AndroidJavaClass unityPlayer = new AndroidJavaClass(UNITY_CLASS))
if (null != unityPlayer)
using (AndroidJavaObject currActivity = unityPlayer.GetStatic&AndroidJavaObject&(&currentActivity&))
if (null != currActivity)
using (AndroidJavaObject intentFilter = new AndroidJavaObject(&android.content.IntentFilter&, new object[] { &android.intent.action.BATTERY_CHANGED& }))
using (AndroidJavaObject batteryIntent = currActivity.Call&AndroidJavaObject&(&registerReceiver&, new object[] { null, intentFilter }))
int level = batteryIntent.Call&int&(&getIntExtra&, new object[] { &level&, -1 });
int scale = batteryIntent.Call&int&(&getIntExtra&, new object[] { &scale&, -1 });
// Error checking that probably isn't needed but I added just in case.
if (level == -1 || scale == -1)
return 50f;
return ((float)level / (float)scale) * 100.0f;
catch (System.Exception ex)
return 100;
二、Android平台插件开发注意事项
1、推荐使用Android Studio来开发。不要在用Eclse ADT了。
2、使用gradle来编译。Android开发的编译经历了Ant、Maven到Gradle。Gradle提供了更加灵活强大的构建支持。从依赖管理到编译控制。
3、推荐使用CMake来编译jni部分代码。官方不再推荐使用ndk来编译了。Android Studio和Gradle也支持CMake。
4、编译出来的东西是一个.aar的文件,这个相对于.jar来说,就是一个更加丰富的包。它可以包含资源、动态库、jar代码、AndroidManifest.等等。
5、工程中要加入classes.jar,这个可以在Unity的安装路径中找到。我们需要的UnityPlayer等等都是在这个包里面的。不过有一点比较麻烦的是,在打包完毕之后必须将aar包中的此文件再删除掉(libs/classes.jar),否则会造成冲突导致Unity打包失败。
6、build.gradle中的minSdkVersion&targetSdkVersion要跟Unity中的设置一致。如果之前在项目中已经有AndroidManifest.xml了,则这些数据要一致,否则也会编译失败。
7、自己如果需要扩展Activity的行为,则需要自己实现一个新的MyUnityPlayerActivity,继承自UnityPlayerActivity。修改后,AndroidManifest.xml中相关内容也要进行修改。如果仅仅是想封装一些原生系统功能的话,那么直接写一个类就可以了。需要用到Activity的时候,使用UnityPlayer.currentActivity调用相关函数即可。
& & & 另外再注意一下,在C#代码中创建AndroidJavaClass的时候传入的参数应该包含完整的包名,比如 com.xxxx.MyPlugin,而不仅仅是一个类名。
优质网站模板

我要回帖

更多关于 如何编写cad插件 的文章

 

随机推荐