unity3d 调用静态类_unity 调用另一个类中的非静态方法 - CSDN
  • Unity 静态类 Static Class

    2018-02-04 13:58:15
    1 静态类: 1. 不能继承Monobehaviour 2.不可以用在Unity 物体上 。 3.所有成员,变量函数等,都得是静态的。 4 静态类构造函数是静态的,并且私有的,可以用来初始化,数据。 使用 . 1.主要用来设计 帮助函数 ...

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

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

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

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

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

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

    展开全文
  • Unity3D的API提供了很多的功能,但是很多方法还是会自己去封装一下去。当然现在网上也有很多的框架可以去下载使用,但是肯定不会比自己写的用起来顺手。 对于是否需要使用框架的问题上,本人是持肯定态度的,把一些...

    Unity3D的API提供了很多的功能,但是很多流程还是会自己去封装一下去。当然现在网上也有很多的框架可以去下载使用,但是肯定不会比自己写的用起来顺手。

    对于是否需要使用框架的问题上,本人是持肯定态度的,把一些常用方法进行封装,做成一个功能性的框架,可以很大程度上提高代码的效率,维护也方便。

    对于网络上很多教程上使用的“游戏通用MVC框架”,现在看来并不符合MVC这种结构性框架的设计思想:要知道,MVC最初是被设计为Web应用的框架,而游戏中的很多事件并不是通过用户点击UI发生的,View和Controller在游戏逻辑中的占比一般都少的可怜,而且很多教程上把Model剥离出很多“Manager”模块,甚至有人把View和Controller合在一起写了UIManager——连MVC的结构都没了,为啥还要称之为MVC框架呢?
    MVC: “人红是非多。。。。”

    目前大部分的游戏框架——特别是小型项目的游戏框架——都是把一些数据的特定行为进行了一下封装:生成一个物件,播放一个特效,进行一次随机事件等。当然也会有一些结构性的设计或者资源管理设计如:UI的回退栈或者回退链,场景的载入记录和切换,下载队列的管理等。

    在Unity的框架设计中,有一个词会经常见到:单例模式(singleton)。单例模式就是在整个游戏中只使用某个类的一个实例,核心的一句话就是public static T Instance;即在类中定义了一个静态的自身实例供外部使用,调用方法时就是:T.Instance.Function()。在本人最初接触这种设计方式时经常会与静态类弄混淆,T.Function()。中间差了一个静态Instance,很多时候好像区别不大。。。

    在接近两周左右的时间里,我一直在纠结于自己正在写的框架到底应该写成单例模式的还是静态模式的,今天刚好对这个问题有了一个新的想法:静态可不可以理解为一种封闭性很强的单例?

    首先回想一下静态的两个常识:

    1. 静态类不能继承和被继承!(严格点说是只能继承System.Object)也就是说你的静态类不可能去继承MonoBehaviour,不能实现接口。
    2. 静态方法不能使用非静态成员!如果你大量使用静态方法,而方法里又需要用到这个类的成员,那么你的成员得是静态成员。

    第2点需要注意:如果你想在Unity的编辑器下调整某个参数,那么这个参数就不能是静态的(哪怕你自定义EditorWindow去修改这个值也没用),解决的办法是通过UnityEngine.ScriptableObject去存放配置(生成*.asset文件),然后在运行中通过LoadAsset去加载,然后再改变静态成员。至于原因,相信不难理解——你看到的所有Unity组件都是一个个实例,你要通过Unity的编辑器去配置,那么你就得有一个这样的可配置实例。

    从面向对象上想一下:静态方法或者静态类,不需要依赖对象,类是唯一的;单例的静态实例,一般就是唯一的一个对象(当然也可以有多个)。差别嘛。。。好像也不大。。。

    如果这样考虑没有错,那再回头比较一下两种方式:

    1. 静态(静态方法或者静态类),代码编写上绊手绊脚,方法调用很方便,运行效率高一丢丢。逻辑面向过程,不能很好地控制加载和销毁。
    2. 单例(类的静态实例),代码编写和其他类完全一样,继承抽象模版接口都可以,Unity里也很方便进行参数配置,不过使用麻烦有犯错的可能性(必须通过实例调用方法),效率不如静态(但是也不会有很大影响吧)。

    如果这些说法太抽象,那我再给出一个常见的问题:如果你的框架有一个SoundManager能够管理所有的声音播放,那么你会怎么去实现?
    (在刚接触AudioSource这个组件的时候,我想的是每一个声音都由一个AudioSource去播放。但是后来发现完全没必要,AudioSource有静态的PlayClipAtPoint方法去播放临时3D音效,同时有实例方法PlayOneShot去播放临时音效(2D和3D取决于当实例的SpatialBlend)。如果没有特殊的需求,那么一个AudioSource循环播放背景音乐,上述两种方法播放游戏中的特效音频,这对于大部分游戏已经足够了。)

    那么问题来了:你的SoundManager播放声音的方法如果是静态的,那么AudioSource组件必须在代码中通过各种方式去获取(新建组件或者获取特定GameObject下的组件)——因为保存这个组件的变量必须是静态的,也就不能通过Unity的编辑器去赋值。如果不去阅读代码那么用户完全不知道这是一个什么样的组件获取流程,如果我破坏这个流程(同名物体,包含互斥组件等),那么这个Manager很有可能会出现不可预料的异常。
    而继承MonoBehaviourRequireComponent(typeof(AudioSource)),怎么看也比“为了静态而静态”的代码要方便健壮的多。

    实际上到这里已经可以基本总结出何时需要使用单例了:

    1. 只要你的类需要保存其他组件作为变量,那么就有必要使用单例;
    2. 只要你有在Unity编辑器上进行参数配置的需求,那么就有必要使用单例;
    3. 只要你的管理器需要进行加载的顺序控制,那么就有必要使用单例(比如热更新之后加载ResourcesManager);

    当然,这里都只是“有必要”,并不是“必须”。两者区别最大的地方,一个是方便写,一个是方便用。方便写的代价是每次调用加个instance,方便用的代价则是放弃了面向对象和Unity的“所见即所得”,孰轻孰重,自己抉择。

    另一方面,和“为了静态而静态”一样,“为了单例而单例”同样是一个不合理的设计。这样的解释仍然是那么的模糊,那么,就给自己定义一个最简单的规则吧——如果你的单例类里没有任何需要保存状态的变量,那么这个类里的方法就可以全都是静态方法,这个类也可以是个静态类。

    展开全文
  • 转自:... 这里用的unity3d的版本是5.3.2 在eclipse里新建一个java工程,并导出成jar。 [java] view plain copy package com.innyo.androidplugin; public c

    转自:http://blog.csdn.net/wuyt2008/article/details/50749300

    这里用的unity3d的版本是5.3.2

    在eclipse里新建一个java工程,并导出成jar。


    1. package com.innyo.androidplugin;  
    2.   
    3. public class apTest {  
    4.   
    5.     public apTest(String inString) {  
    6.         tryProp = "propties is ok.<" + inString + ">";  
    7.     }  
    8.   
    9.     public String tryProp = "public propties is return.";  
    10.   
    11.     public static String tryStaticProp = "static propties is return.";  
    12.   
    13.     public String TryPublic() {  
    14.         return "public method run ok.";  
    15.     }  
    16.   
    17.     public String TryPublic(String inString) {  
    18.         return "public method with prop run ok.<" + inString + ">";  
    19.     }  
    20.   
    21.     public static String TryStaticPublic() {  
    22.         return "static public method run ok.";  
    23.     }  
    24.   
    25.     public static String TryStaticPublic(String inString) {  
    26.         return "static public method whith prop run ok.<" + inString + ">";  
    27.     }  
    28. }  

    导出为jar




    新建unity3d工程,导入jar文件。


    新建一个场景,把内容输出到text上显示,

    1. using UnityEngine;  
    2. using System.Collections;  
    3. using System;  
    4. using UnityEngine.UI;  
    5.   
    6. public class TryPlugin : MonoBehaviour  
    7. {  
    8.   
    9.     public Text t;  
    10.   
    11.     public void ToTry ()  
    12.     {  
    13.         try {  
    14.             t.text = "start android plugins";  
    15.   
    16.             t.text = t.text + "\r\n";  
    17.             AndroidJavaClass jc = new AndroidJavaClass ("com.innyo.androidplugin.apTest");  
    18.             t.text = t.text + "AndroidJavaClass jc:" + jc.ToString ();  
    19.   
    20.             t.text = t.text + "\r\n";  
    21.             t.text = t.text + "tryProp:" + jc.Get<string> ("tryProp");  
    22.   
    23.             t.text = t.text + "\r\n";  
    24.             t.text = t.text + "tryStaticProp:" + jc.GetStatic<string> ("tryStaticProp");  
    25.   
    26.             t.text = t.text + "\r\n";  
    27.             t.text = t.text + "TryPublic:" + jc.Call<string> ("TryPublic");  
    28.   
    29.             t.text = t.text + "\r\n";  
    30.             t.text = t.text + "TryPublic:" + jc.Call<string> ("TryPublic""unity3d input");  
    31.   
    32.             t.text = t.text + "\r\n";  
    33.             t.text = t.text + "TryStaticPublic:" + jc.CallStatic<string> ("TryStaticPublic");  
    34.   
    35.             t.text = t.text + "\r\n";  
    36.             t.text = t.text + "TryStaticPublic:" + jc.CallStatic<string> ("TryStaticPublic""unity3d input");  
    37.   
    38.             t.text = t.text + "\r\n";  
    39.             t.text = t.text + "----------------------------------------";  
    40.   
    41.             t.text = t.text + "\r\n";  
    42.             AndroidJavaObject jo = new AndroidJavaObject("com.innyo.androidplugin.apTest","unity3d jo build");  
    43.             t.text = t.text + "AndroidJavaObject jo:" + jo.ToString ();  
    44.   
    45.             t.text = t.text + "\r\n";  
    46.             t.text = t.text + "tryProp:" + jo.Get<string> ("tryProp");  
    47.   
    48.             t.text = t.text + "\r\n";  
    49.             t.text = t.text + "tryStaticProp:" + jo.GetStatic<string> ("tryStaticProp");  
    50.   
    51.             t.text = t.text + "\r\n";  
    52.             t.text = t.text + "TryPublic:" + jo.Call<string> ("TryPublic");  
    53.   
    54.             t.text = t.text + "\r\n";  
    55.             t.text = t.text + "TryPublic:" + jo.Call<string> ("TryPublic""unity3d input");  
    56.   
    57.             t.text = t.text + "\r\n";  
    58.             t.text = t.text + "TryStaticPublic:" + jo.CallStatic<string> ("TryStaticPublic");  
    59.   
    60.             t.text = t.text + "\r\n";  
    61.             t.text = t.text + "TryStaticPublic:" + jo.CallStatic<string> ("TryStaticPublic""unity3d input");  
    62.   
    63.         } catch (Exception ex) {  
    64.             t.text = t.text + "\r\n";  
    65.             t.text = t.text + ex.Message;  
    66.         }  
    67.     }  
    68. }  

    编译成安卓,然后运行,点击按钮,可以看到以下结果



    AndroidJavaClass只能调用静态方法,获取静态属性

    AndroidJavaObject能调用公开方法和公开属性

    另外,jar文件,不一定非要放在plugins/android目录下。

    例子代码:http://download.csdn.net/detail/wuyt2008/9444745


    =====================================


    如果是调用jar类中的枚举,而且枚举必须不是类下面的,方法如下

    java

    1. package com.innyo.androidplugin;  
    2.   
    3. public enum TryEnum {  
    4.     red,green,yellow,blcak  
    5.   
    6. }  


    unity3d
    1. AndroidJavaObject redValue =   
    2.     new AndroidJavaClass("com.innyo.androidplugin.TryEnum").GetStatic<AndroidJavaObject>("red");  



    如果是调用jar类中的接口,实在是不会在java中写事件接口,只好拿别人的用。

    unity3d

    1. public class DateCallback : AndroidJavaProxy  
    2. {  
    3.     public DateCallback ()  
    4.         : base ("com.amap.api.location.AMapLocationListener")  
    5.     {  
    6.     }  
    7.   
    8.     void onLocationChanged (AndroidJavaObject amapLocation)  
    9.     {  
    10.           
    11.     }  
    12. }  

    等效于java中写
    1. public class Hight_Accuracy_Activity implements AMapLocationListener {  
    2.   
    3.     @Override  
    4.     public void onLocationChanged(AMapLocation loc) {  
    5.   
    6.     }  


    展开全文
  • 下面的示例解释了为Unity3D引擎编写脚本的时候如何来使用静态变量.本文示例的脚本使用C#编写,同样的适用于javascript。  在深入主题之前,必须要清楚地是我们应该尽量避免使用静态变量,有大量的缘由可以很容易在 ...

    下面的示例解释了为Unity3D引擎编写脚本的时候如何来使用静态变量.本文示例的脚本使用C#编写,同样的适用于javascript。

     在深入主题之前,必须要清楚地是我们应该尽量避免使用静态变量,有大量的缘由可以很容易在

    网上找到.大部分时候使用单例更好。了解了上面的东西之后,这里有一个对静态变量的简单定义:

    它们是属于类的变量,不属于对象或类创建。这意味着静态变量始终保持同样的值,不论给定类的对象是什么

    另外一个特征是:只要类处于内存中,它们仍是有效的引用。静态变量在类创建之前由编译器初始化,先于其他变量

    或方法.但是这对于Unity3D来说又意味这什么呢?

    这意味着不需要产生一个类对象来读或者写一个变量值,所以只需要一次性获取游戏对象或组件。

    下面是一个示例:有50个敌人对象在一个unity3D场景中,它们都绑定了AI脚本并且需要主角的Transform

    来正确的工作,那么在每个敌人的Awake()函数中如果不使用静态变量的话应该是:

     

    [csharp] view plaincopy
     
    1. public class EnemyBehaviour:MonoBehaviour  
    2. {  
    3.     private Transform playerTransform;  
    4.     void Awake()  
    5.     {  
    6.         playerTransform = GameObject.FindWithTag("Player").GetComponent<Transform>();  
    7.   
    8.     }  
    9.   
    10.     void Update()  
    11.     {  
    12.         // Do Something Based On The Player's Position  
    13.         if(playerTransform.position.x>100)  
    14.         {  
    15.             // Do Something   
    16.         }  
    17.     }  
    18. }  


    利用静态变量来做同样的事情,应该创建一个称为GameController的脚本。它可以一次性获得主角的Transfrom然后将它存入静态变量:

    [csharp] view plaincopy
     
    1. public class GameController:MonoBehaviour  
    2. {  
    3.     public static Transform playerTransform;  
    4.       
    5.     void Awake()  
    6.     {  
    7.         playerTransform = GameObject.FindWithTag("Player").GetComponent<Transform>();  
    8.     }  
    9. }  


     

    接下来,无论何时敌人的AI脚本需要知道主角的位置,只需要调用静态变量:

    [csharp] view plaincopy
     
    1. public class EnemyBehaviour:MonoBehaviour  
    2. {  
    3.     void Update()  
    4.     {  
    5.         // Acessing The Static Variable  
    6.         if(GameController.playerTransform.position.x > 100)  
    7.         {  
    8.             // Do Something  
    9.         }  
    10.     }  
    11. }  


     

    注意到在第二个例子中,我们只需要调用一次Awake()方法来获得主角对象的Transform引用。然而在第一个例子中则需要

    在每个敌人调用一次Awake()方法,这样就调用了50次该方法。 所以即使在场景中有50个敌人依然只需要调用一次的Awake

    方法,应为其他脚本可以直接调用GameController暴露的静态变量。

    展开全文
  • 下面的示例解释了为Unity3D引擎编写脚本的时候如何来使用静态变量.本文示例的脚本使用C#编写,同样的适用于javascript。  在深入主题之前,必须要清楚地是我们应该尽量避免使用静态变量,有大量的缘由可以很容易在 ...
  • Unity的安装目录(Editor\Data\PlaybackEngines\androidplayer)找到AndroidManifest.xml文件。 b.在Unity项目中,创建(Plugins\Android)文件夹,并将AndroidManifest.xml拖入。 c.编辑AndroidManifest文件,在...
  • 网络上大家可以看到很多把android project打包,然后以插件的方式,放入Unity3D工程中来调用的方式,这种方式,我不做评论,但是很麻烦...
  • 之前总感觉会封装dll组件的都是大牛级别的程序员做的事情,然后供给菜鸟级别的调用。感觉为了保护自己的源码不会被他人知道,然后就封装一...首先要申明的是,unity3d支持C#语言,但只有pro版本才支持.net2.0,其他版本
  • Unity3D调用Lua的方法还是比较简单的,所以先说这个,由于这部分在学习笔记(一)中已经说的挺多的了,更多的内容点击这里回去看,所以这里我们就来看一个简单的示例即可: 1 using LuaInterfac...
  • 这篇笔记主要集中学习一下...Unity3D调用Lua的方法还是比较简单的,所以先说这个,由于这部分在学习笔记(一)中已经说的挺多的了,更多的内容点击这里回去看,所以这里我们就来看一个简单的示例即可: 1 using L
  • 大家在做游戏的过程中可能都会遇到这样的情况:很多类,很多物体,都需要使用同一个方法来实现相同功能,就像c#或其他编程语言中的静态类那样使用。那么unity 3d有没有这样的功能呢?答案是当然有了。 先简单介绍...
  • tolua调用C#中的静态类

    2019-09-25 13:20:06
    一、创建unity中引用lua虚拟机接口的库 using UnityEngine; using System.Collections; using LuaInterface; using WCALibs; public class LUA_Test : MonoBehaviour { //声明lua对象,以及lua函数对象 ...
  • 协程使用IEnumerator修饰符,yield return返回 第一种方式: .IEnumerator Start()  {  Debug.Log ("开始等待:" + Time.time);  yield return new WaitForSeconds (5);  Debug.Log ("......
  • AndroidJavaClass javaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); currentActivity = javaClass.GetStatic("currentActivity"); AndroidJavaClass wxPayResult =
  • Unity调用Android方法

    2019-05-03 01:00:34
    1. 添加Unity的classes.jar文件 创建一个Android工程AndroidUnityDemo。 由于Unity的版本不同,直接在Unity安装包文件夹里面搜索classes.jar文件,如果有多个classes.jar文件,一般选择的是mono/Release文件夹下的...
  • 今天我要写的是unity与android的交互中unity调用java函数。也是因为工作的需要。之前在网上找到了两种方法,但是今天我具体讲的的是第一种。 **一、将uinty项目导成android工程后二次开发 二、使用eclipse新建一个...
1 2 3 4 5 ... 20
收藏数 4,705
精华内容 1,882
关键字:

unity3d 调用静态类