unity3d百度api_unity3d api 3d世界到2d屏幕 - CSDN
  • Unity3D——百度地图SDK接入(经验)

    万次阅读 热门讨论 2016-12-15 21:52:42
    Unity 3D百度地图SDK接入经验


    一、从Unity中导出安卓工程

    导出工程时注意的问题:

    (1)PlayerSetting中的bundle identifier要设置一下


    (2)工程签名的制作

    进入DOS界面,进去D:\ProgramFiles\Java\jdk1.6.0_10\bin>目录下,输入keytool -genkey -alias android.keystore -keyalg RSA -validity 100000 -keystore android.keystore参数意义:-validity主要是证书的有效期,写100000天;空格,退格键都算密码。命令执行后会在 D:\ProgramFiles\Java\jdk1.6.0_10\bin 目录下生成android.keystore文件。

    (3)导出



    二、将导出的项目利用eclipse接入百度地图SDK并生成jar包

    我的eclipse工程目录:


    资源的导入是参照百度地图SDK接入指南的:http://lbsyun.baidu.com/index.php?title=androidsdk/guide/introduction

    其中res/layout下的布局xml文件来自下载的BaiduLBS_AndroidSDK_Sample,具体路径是BaiduLBS_AndroidSDK_Sample\BaiduMap_AndroidSDK_v4.1.1_Sample\BaiduMapsApiDemo\res\layout

    bin目录下生成了jar文件是原理:鼠标工程名字上右键Properties属性,勾选Is Library,之后在每次Project/Build All就可以实现更新;如下图所示:


    下面是各个文件里面的代码


    主入口文件MainActivity.java

    package com.zhf;
    
    import android.content.Intent;
    import android.os.Bundle;
    
    import com.unity3d.player.UnityPlayerActivity;
    
    public class MainActivity extends UnityPlayerActivity {
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    	}
    	
    	public String getStringInJava() {
    		return "i am a string from java";
    	}
    	
    	public void OpenNewScene() {
    		Intent intent = new Intent(MainActivity.this, EmptyScene.class);
    		this.startActivity(intent);
    	}
    	public void OpenBaiduMap() {
    		Intent intent = new Intent(MainActivity.this, MyBaiduMapActivity.class);
    		this.startActivity(intent);
    	}
    }


    EmptyScene.java

    package com.zhf;
    
    import android.app.Activity;
    import android.os.Bundle;
    
    public class EmptyScene extends Activity {
    	
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    	}
    }

    MyBaiduMapActivity.java

    package com.zhf;
    
    import com.baidu.mapapi.SDKInitializer;
    import com.baidu.mapapi.map.MapView;
    
    import android.app.Activity;
    import android.os.Bundle;
    
    public class MyBaiduMapActivity extends Activity {
    	
    	MapView mMapView = null;
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		
    		super.onCreate(savedInstanceState);
    		
    		SDKInitializer.initialize(getApplicationContext());
    		setContentView(R.layout.activity_main);
            
            mMapView = (MapView) findViewById(R.id.bmapView);
    	}
        @Override
        protected void onDestroy() {
            super.onDestroy();  
            //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理  
            mMapView.onDestroy();
        }
        @Override
        protected void onResume() {
            super.onResume();
            //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理 
            mMapView.onResume();
        }
        @Override  
        protected void onPause() {  
            super.onPause();
            //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理  
            mMapView.onPause();  
        }
    }
    


    布局文件Activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
    
        <com.baidu.mapapi.map.MapView
            android:id="@+id/bmapView"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:clickable="true" />
    
    </LinearLayout>


    主配置文件AndroidManifest.xml

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.zhf" android:versionName="1.0" android:versionCode="1" android:installLocation="preferExternal">
      <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" />
      <application android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:icon="@drawable/app_icon" android:label="@string/app_name">
        
        <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="F7lsGhPU9a6XWiMIi6EbSTbsORx6zKr8" />
          
        <activity android:label="@string/app_name" android:screenOrientation="fullSensor" android:launchMode="singleTask" android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale" android:name="com.zhf.MainActivity">
          <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
            <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
          </intent-filter>
          <meta-data android:name="unityplayer.UnityActivity" android:value="true" />			
        </activity>
        
        <activity android:name="com.zhf.EmptyScene" android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
        </activity>
        
        <activity android:name="com.zhf.MyBaiduMapActivity" android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
        </activity>
        
    	</application>
    	<uses-sdk android:minSdkVersion="16" android:targetSdkVersion="23" />
    	<uses-feature android:glEsVersion="0x00020000" />
    	<uses-permission android:name="android.permission.INTERNET" />
    	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    	<uses-feature android:name="android.hardware.touchscreen" android:required="false" />
    	<uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="false" />
    	<uses-feature android:name="android.hardware.touchscreen.multitouch.distinct" android:required="false" />
      
    	<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    	<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
    	<uses-permission android:name="android.permission.WAKE_LOCK"/>
    	<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    	<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    	<uses-permission android:name="android.permission.GET_TASKS" />
    	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    	<uses-permission android:name="android.permission.WRITE_SETTINGS" />
      
    </manifest>

    Build All 完毕

    三、将导出的jar包应用到Unity中,实现SDK接入

    需要导入到Unity中的文件(划了黑线的不要,以及armeabi-v7a中libmain.so、libmono.so和libunity.so文件不要):


    在Unity中的视图结构:


    必须在Plugins下面的Android目录下,注意assets是来自这里:


    上面assets目录没有放到Unity工程中,程序运行了就崩溃,耗了一天时间找bug


    四、编写C#脚本,实现交互

    完成上面的之后新建一个场景,加入一个UGUI的Text控件,新建一个脚本Test

    Test.cs代码:

    using UnityEngine;
    using UnityEngine.UI;
    using System.Collections;
    
    public class Test : MonoBehaviour {
    
    
        public Text text;
    	void Update () {
            if (Input.GetKeyDown(KeyCode.Escape) || Input.GetKeyDown(KeyCode.Home)) {
                Application.Quit();
            }
    	}
    
        void OnGUI() {
            if (GUILayout.Button("Open Map", GUILayout.Height(100)))
            {
                AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
                AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
                jo.Call("OpenBaiduMap");
            }
    
            if (GUILayout.Button("Open New Scene", GUILayout.Height(100)))
            {
                AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
                AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
                jo.Call("OpenNewScene");
            }
    
            if (GUILayout.Button("改变Label___New", GUILayout.Height(100)))
            {
                AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
                AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
                text.text = jo.Call<string>("getStringInJava");
            }
    
        }
    }
    

    脚本挂载在相机上,Text控件拖上去,然后开始打包

    打包时注意:Player Setting中的 bundle identifier要填上对应的包名



    end


    展开全文
  • Unity3D常用API

    千次阅读 2017-08-13 14:36:26
    Unity3D常用API总结一. MonoBehaviour类及查询API MonoBehaviour是每个脚本的基类. MonoBehaviour常用方法及调用顺序 //最开始调用,做一些初始化工作。建议少用,此刻物体可能还没有实例化出来,会影响程序执行...

    Unity3D常用API总结

    一. MonoBehaviour类及查询API

    MonoBehaviour是每个脚本的基类.

    MonoBehaviour常用方法及调用顺序

       //最开始调用,做一些初始化工作。建议少用,此刻物体可能还没有实例化出来,会影响程序执行顺序。
        void Awake(){}
        // 不是很紧急的初始化,一般放在Start里面来做。仅在Update函数第一次被调用前调用。
        void Start(){}
        //用户点击检视面板的Reset按钮或者首次添加该组件时被调用。此函数只在编辑模式下被调用。Reset最常用于在检视面板中给定一个最常用的默认值。
        void Reset(){}
        // 每一帧调用一次,帧间隔时间有可能改变。
        void Update(){}
        //以相同时间间隔调用,用在力学更新效果中。执行在Update之前。
        void FixedUpdate(){}
        //在Update和FixedUpdate调用之后调用。一般人物的移动放在Update中,而摄像机的跟进变化放到FixedUpdate中。确保两个独立,一前一后,不产生错误。
        void LateUpdate(){}
    
        //On开头的方法,是由其他事件触发调用的。
        //物体被删除时调用
        void OnDestroy(){}
        //物体启用时被调用
        void OnEnable(){}
        //物体被禁用时调用
        void OnDisable(){}
        //这个函数会每帧调用好几次(每个事件一次),GUI显示函数只能在OnGUI中调用
        void OnGUI(){}

    下图是单个脚本内部方法的调用顺序:
    这里写图片描述

    查询API:游戏蛮牛Unity3D-API

    二. Input类及脚本字段属性在检视面板中的运用

    输入系统的接口.
    getaxis、getkey、getbutton、getjoystick等函数。

    为了提高输入方式在代码中的效率,推荐用GetButton()方法,而不是GetKey().GetButton根据不同的设备进行对应的按键输入,比如手柄,PC,手机 etc.

    Unity中定制按钮的方式
    Edit–>project setting–>Input
    具体按键设定规则见:Unity圣典Input输入

    GetKey()、GetKeyDown()、GetKeyUp()方法:

        // 每一帧调用一次,帧间隔时间有可能改变。
        void Update()
        {
            //KeyCode为枚举类
            //GetKey方法:只要按下就会执行 直到不按 执行不止一次
            Input.GetKey(KeyCode.A);
            //GetKeyDown:按下按键执行 执行一次
            Input.GetKeyDown(KeyCode.A);
            //GetKeyDown:按下后松开按键执行 执行一次
            Input.GetKeyUp(KeyCode.A);
            //以上方法返回布尔值
        }

    GetButton()、GetButtonDown()、GetButtonUp()方法:

        // 每一帧调用一次,帧间隔时间有可能改变。
        void Update()
        {
            //GetButton方法括号中的值为buttonName(按钮别称) 可在相关文档中查阅
            //GetButton方法:只要按下就会执行 直到不按 执行不止一次
            Input.GetButton("Jump");
            //GetButtonDown:按下按键执行 执行一次
            Input.GetButtonDown("Jump");
            //GetButtonDown:按下后松开按键执行 执行一次
            Input.GetButtonUp("Jump");
            //以上方法返回布尔值
        }

    GetAxis() 获取轴

    根据坐标轴名称返回虚拟坐标系中的值。
    使用控制器和键盘输入时此值范围在-1到1之间。如果坐标轴设置为鼠标运动增量,鼠标增量乘以坐标轴灵敏度的范围将不是-1到1 。

    C#脚本:

    // A very simplistic car driving on the x-z plane.
    // 一个十分简单的在x-z平面的驾车例子
    using UnityEngine;
    using System.Collections;
    
    public class example : MonoBehaviour {
        public float speed = 10.0F;//移动速度
        public float rotationSpeed = 100.0F;//旋转速度
    
        void Update() {
            // Get the horizontal and vertical axis.
            //获取横向和纵向坐标轴
            // By default they are mapped to the arrow keys.
            //默认情况下他们关联到方向键上
            // The value is in the range -1 to 1
            //值的范围是在-1到1之间
            float translation = Input.GetAxis("Vertical") * speed;
            float rotation = Input.GetAxis("Horizontal") * rotationSpeed;
    
            // Make it move 10 meters per second instead of 10 meters per frame...
            // 使它每帧移动10米变为每秒移动10米...
            translation *= Time.deltaTime;
            rotation *= Time.deltaTime;
    
            // Move translation along the object's z-axis
            //沿着z轴平移对象
            transform.Translate(0, 0, translation);
    
            // Rotate around our y-axis
            //以我们的y轴为中心旋转
            transform.Rotate(0, rotation, 0);
        }
    }
    // Performs a mouse look.
    //执行一个鼠标观察
    using UnityEngine;
    using System.Collections;
    
    public class example : MonoBehaviour {
        public float horizontalSpeed = 2.0F;
        public float verticalSpeed = 2.0F;
        void Update() {
            // Get the mouse delta. This is not in the range -1...1
            //获取鼠标增量,范围不在-1...1
            float h = horizontalSpeed * Input.GetAxis("Mouse X");
            float v = verticalSpeed * Input.GetAxis("Mouse Y");
            transform.Rotate(v, h, 0);
        }
    }

    GetJoystickNames() 获取控制杆名称列表

    返回一个用来描述已连接的控制杆的字符串集合。
    它可以用在用户输入设置界面 –这样,你就可以把显示的标签”Joystick 1”换成意义更明确的名字像”Logitech WingMan”,读取不同控制器的值,你需要分别为各个控制器的数字指定指方向轴如果你想将其使用在输入设置中。

    C#脚本:

    // Prints a joystick name if movement is detected.
    //如果检测到移动就输出一个控制杆名称
    using UnityEngine;
    using System.Collections;
    
    public class example : MonoBehaviour {
        void Update() {
            // requires you to set up axes "Joy0X" - "Joy3X" and "Joy0Y" - "Joy3Y" in the Input Manger
            //你需要在输入管理器中设置方向轴"Joy0X" - "Joy3X""Joy0Y" - "Joy3Y"
            int i = 0;
            while (i < 4) {
                if (Mathf.Abs(Input.GetAxis("Joy" + i + "X")) > 0.2F || Mathf.Abs(Input.GetAxis("Joy" + i + "Y")) > 0.2F)
                    Debug.Log(Input.GetJoystickNames()[i] + " is moved");
    
                i++;
            }
        }
    }

    脚本字段属性在检视面板中的运用:

    // Prints a joystick name if movement is detected.
    //如果检测到移动就输出一个控制杆名称
    using UnityEngine;
    using System.Collections;
    
    public class example : MonoBehaviour {
        //public修饰的变量可以在检视面板中显示
        //private修饰的不能显示
    
        //可以显示的GameObject类型的数组 
        //在检视面板中有Size(数组大小)和Element(元素)两个属性
        public GameObject[] gameObject = new GameObject[10];
    
        //可以显示的一个Rigidbody类型的变量
        public Rigidbody rigidbody = new Rigidbody();
    
        //不能显示的string类型字符串
        private string NPCName = "Max";
    
        //可以显示的int类型数值
        public int Score = 11;
    
        //自动补全 在脚本中定义的初始值会在检视面板中显示
        public int Number { get; set; }
    
        void strat(){}
        void update(){}
    }

    三.Time类及单例模式实现

    常用Time.deltaTime

    在Update/LateUpdate中打印Time.deltaTime时间是不固定的,是一个动态变化值,是前两帧之间时间的差值。

    在FixedUpdate中打印Time.deltaTime时间是固定的。

    deltaTime() 增量时间

    以秒计算,完成最后一帧的时间(只读)。
    使用这个函数使和你的游戏帧速率无关。

    放在Update()函数中的代码是以帧来执行的.如果我们需要物体的移动以秒来执行.我们需要将物体移动的值乘以Time.deltaTime。

    如果你加或减一个每帧改变的值,你应该与Time.deltaTime相乘。当你乘以Time.deltaTime实际表示:每秒移动物体10米,而不是每帧10米。

    当从MonoBehaviour的FixedUpdate里调用时,返回固定帧速率增量时间(fixedDeltaTime)。

    请注意从OnGUI里你不应该依赖于Time.deltaTime,因为OnGUI可以在每帧被多次调用并且每个调用deltaTime将持有相同的值,直到下一帧再次更新。

    C#脚本:

    using UnityEngine;
    using System.Collections;
    
    public class example : MonoBehaviour {
        void Update() {
            // Move the object 10 meters per second!
            //每秒移动物体10米
            float translation = Time.deltaTime * 10;
            transform.Translate(0, 0, translation);
        }
    }

    单例模式singleton

    单例仅允许被实例一次,这就保证了他在各个程序模块间的唯一性。

    //一般使用单例模式时,类名可能为GameManager
    //通常用于控制游戏流程 哪个关卡 哪一步 角色信息的记录
    //排行榜 积分表等
    //在游戏中,单例模式一般在数据的保存和读取时用到
    private static ModelLocator instance;
    public static ModelLocator getInstance{
        get{
            if(instance==null){
                instance=new ModelLocator();
            }
            return instance;
        }
    }

    详细的Unity中单例模式的应用,百度”Unity中的单例模式”
    二周目的时候详细补充在这

    四.GameObject类和对象,多种查找GO的方法

    gameObject(g小写)代表当前脚本挂载的游戏对象本身。
    若使用this.xxx的话调用的是脚本本身而不是游戏对象

    GameObject(G大写)代表游戏对象类。

    查找GO并赋值Find族函数:

    private GameObject go;

    go = GameObject.Find(“Cube”);//根据名字查找对象

    go = GameObject.FindGameObjectWithTag(string tag);//根据标签查找

    go.activeSelf 游戏物体是否被激活(true or false)

    go.activeInHierarchy 游戏物体所处层级的父级是否被激活(true or false)


    理解游戏组件和游戏对象的关系

    创建一个cube,并不是创建一个cube对象,而是创建了挂载着filter和renderer组件的对象


    五.Destroy方法和Transform对象(包括对象移动)

    Destroy方法:

    销毁一个游戏物体。
    Destroy(go);
    Destroy(go, 3);//等待3s销毁

    Transform对象:

    位置transform.position(注意是小写t,是monobehaviour类中的默认字段,表示当前脚本挂在的游戏物体的transform信息)

    旋转transform.rotation
    缩放transform.scale
    向量及运算 Vector3

    在Unity中为左手坐标系
    这里写图片描述

    移动对象:

    Transform.Translate

    Transform.Rotate

    transform.position.x获取x轴坐标

    Mathf.PingPong 乒乓
    让数值t在 0到length之间往返。t值永远不会大于length的值,也永远不会小于0。
    返回值将在0和length之间来回移动。

    //Mathf.PingPong 乒乓 例子
    using UnityEngine;
    using System.Collections;
    
    public class example : MonoBehaviour {
        void Update() {
        // Set the x position to loop between 0 and 3
        //设置x位置循环在0和3之间
            transform.position = new Vector3(Mathf.PingPong(Time.time, 3), transform.position.y, transform.position.z);
        }
    }

    六.Lerp插值运算

    插值运算:位置Vector3.Lerp 旋转Vector3.Slerp
    Quaternion targetrotation = Quaternion.LookRotation(player.position - transform.position);
    //根据初始和目标位置计算出对应的旋转角度

    插值运算不仅仅可以作为位置、旋转、缩放等计算,还可以做为灯光亮度等的差值计算,也就是说只要是从一个确定状态渐进过渡到另一个确定状态的计算,都可以用到插值运算。
    位置插值:三维向量
    Vector3 targetpostion = player.position + new Vector3(0, 2.42f, -2.42f);
    transform.position = Vector3.Lerp(transform.position, targetpostion, speed * Time.deltaTime);
    旋转插值:三维角度
    Quaternion targetrotation = Quaternion.LookRotation(player.position - transform.position);
    transform.rotation = Quaternion.Slerp(transform.rotation, targetrotation, speed * Time.deltaTime);
    灯光亮度插值:浮点值
    public float newIntensity = 5;
    light.intensity = Mathf.Lerp(light.intensity, newIntensity, speed * Time.deltaTime);
    //light.intensity位当前灯光的值
    颜色插值:
    Color.Lerp(currentColor, newColor, speed * Time.deltaTime);
    其他比如Material.Lerp、Mathf.InverseLerp等,可以通过查手册了解。

    七.Instantiate实例化prefab对象

    所有的C#对象都是继承于object类,包括int、float这些函数类型,当然也包括Monobehaviour、GameObject这些类。

    static function Instantiate(original: Object, position: Vector3, rotation: Quaternion): Object;
    
    public GameObject Spawn() 
    {
        /* 生成prefab的实例化,因为默认是object类型,所以需要强转为GameObject */
        return GameObject.Instantiate(prefab, transform.position, transform.rotation) as GameObject;
    }

    其他方法:
    GameObject.GetComponent:通过游戏物体获取其组件
    CharacterController cc = this.GetComponent();
    Animator animator = this.GetComponent();
    Component.GetComponent:通过游戏物体的组件获取其其他组件Transform player = GameObject.FindGameObjectWithTag(Tags.player).transform;
    PlayerATKAndDamage playerAtkAndDamage = player.GetComponent();
    //PlayerATKAndDamage是一个脚本AddForce:添加力AddTurque:添加扭矩

    八.协同(协程)以及yield

    一般用来在脚本中增加延时效果。因为在Start()或者Update()中是不能直接延时的(WaitForSecond())等待某个操作结束之后再执行代码字符串做为参数:

    void Start () 
    {
        StartCoroutine("DoSomething", 2.0);
        yield WaitForSeconds (1);//可以在任意位置使用yield语句。yield的返回值控制何时恢复协同程序向下执行。这里等待1s之后才会接着执行下面的语句。
        StopCoroutine("DoSomething");
    }
    
    void DoSomething (float someParameter) 
    {
        while (true) 
        {
            print("DoSomething Loop");
            // 停止协同程序的执行并返回到主循环直到下一帧.
            yield;
        }
    }

    IEnumerator做为参数:

    IEnumerator Start()
    {
        StartCoroutine("DoSomething", 2.0F); //StartCoroutine(DoSomething(2.0F)); 使用IEnumerator做参数不能用StopCoroutine停用。
        yield return new WaitForSeconds(1);
        StopCoroutine("DoSomething"); //请注意只有StartCoroutine使用一个字符串方法名时才能用StopCoroutine停用之。
    }
    
    IEnumerator DoSomething(float someParameter)
    {
        while (true) {
            print("DoSomething Loop");
            yield return null;
        }
    }

    开启协同:
    StartCoroutine(string methodName):字符串作为参数可以开启线程并在协程结束前终止线程;开启协程时最多只能传递一个参数,并且性能消耗会更大一点
    StartCoroutine(IEnumerator routine):只能等待协程的结束而不能随时终止(除非使用StopAllCoroutines()方法)
    中止协同:
    StopCoroutine(string methodName):中止一个协同,只能终止该MonoBehaviour中的协同程序
    StopAllCoroutines():中止所有协同,只能终止该MonoBehaviour中的协同程序
    将协同程序所在gameobject的active属性设置为false,当再次设置active为ture时,协同程序并不会再开启。

    yield

    yiled:和协同密切相关的一个概念,一个协同程序在执行过程中,可以在任意位置使用yield语句。yield的返回值控制何时恢复协同程序向下执行。
    yield不可单独使用

      需要与return配合使用,例如:

      1 yield return 0; //等0帧

      2 yield return 1; //等1帧

      3 yield return WaitForSeconds(3.0); //等待3秒

     4 yield return null;//立即返回调用点
    

      所有使用yield的函数必须将返回值类型设置为IEnumerator类型,例如:
      

    IEnumerator DoSomeThingInDelay() {...}

    当然,你也可以把Start()返回值定义为IEnumerator类型,那么在Start里面也可以使用yield延时返回,但不推荐这样做:

    IEnumerator Start()
    {
        StartCoroutine("DoSomething", 2.0F); //StartCoroutine(DoSomething(2.0F)); 使用IEnumerator做参数不能用StopCoroutine停用。
        yield return new WaitForSeconds(1);
        StopCoroutine("DoSomething"); //请注意只有StartCoroutine使用一个字符串方法名时才能用StopCoroutine停用之。
    }

    你也可以把StartCoroutine和yiled return结合起来使用,保证函数执行顺序,这样调用能保证,init1,init2,init3一个一个的执行,不至于出现后面执行的代码引用一个前面未初始化的变量:

    IEnumerator Init()
    {
        yield return StartCoroutine(init1());
        Debug.Log("init1 finish");
        yield return StartCoroutine(init2());
        Debug.Log("init2 finish");
        yield return StartCoroutine(init3());
        Debug.Log("init3 finish");
    }
    
    IEnumerator init1()
    {
        // 模拟初始化
        yield return new WaitForSeconds(2);//
    }
    IEnumerator init2()
    {
        // do somthing..
        yield return new WaitForSeconds(2);//
    }
    IEnumerator init2()
    {
        // do somthing..
        yield return new WaitForSeconds(2);//
    }

    相关的api总结文章有:
    个人开发Unity3d游戏中常用API函数

    展开全文
  • Unity3d百度语音识别项目 基于百度语音识别API,C#语言可用,项目较为简单
  • Unity调用百度API获取当前IP地址工程文件,unity3D版本是5.3.6,里面还含有一些获取本地ip地址的方法,以及调用安卓层的方法,主要还是获取当前地址,在Android或者在Editor下运行都可以检测到当前省份和城市,需要...
  • 百度AI开放平台是百度推出的一个人工智能服务平台,该平台提供了很多当下热门技术的解决方案,如人脸识别,语音识别,语音智能等。其中人脸识别的SDK支持很多语言,包括Java,PHP,Python,C#,Node.js,Android和...

    百度AI开放平台是百度推出的一个人工智能服务平台,该平台提供了很多当下热门技术的解决方案,如人脸识别,语音识别,语音智能等。其中人脸识别的SDK支持很多语言,包括Java,PHP,Python,C#,Node.js,Android和iOS等,使用C#进行脚本语言开发的Unity3d自然也可以很方便的使用这些SKD。

    1、下载人脸识别SDK

    首先我们需要下载最新版的SDK,打开人脸识别SDK下载页面,选择C# SDK下载:
    SKD下载

    下载解压后得到一个叫aip-csharp-sdk-3.0.0的文件夹,其中AipSdk.dll提供了我们进行人脸识别开发需要的API,AipSdk.XML是对DLL的注释。thirdparty中包含了sdk的第三方依赖,Demo中是一些使用示例,可以进行参考。
    文件目录

    2、导入SDK

    由于SDK已经被打包成DLL文件,所以我们导入使用起来也十分方便,只需将解压后的文件夹直接导入到工程即可。当然为了方便管理我们可以将SDK导入到Plugins文件夹中,需要注意的是一定要讲第三方依赖一起导入不然会报错。
    Plugins目录

    导入后可能会有如下错误:
    .Net报错
    这是由于我们在Player设置中选择的Api Compatibility Level是.Net 2.0 Subset,即.Net 2.0的子集,这里需要改成.Net 2.0。选择Edit->Project Settings->Player,在Other Settings中将Api Compatibility Level更改为.Net 2.0:
    .Net2.0

    3、创建应用

    下面将以人脸检测为示例简单介绍一下SDK的使用。
    使用SDK前我们需要先注册一个百度账号,然后登陆百度AI开放平台,创建一个人脸识别应用。
    选择控制台并登录:
    选择控制台

    在控制台已开通服务中选择人脸识别:
    人脸识别

    然后点击创建应用,输入应用名,应用类型,接口选择(默认创建人脸识别的应用),和应用描述,点击立即创建,创建完毕后点击查看应用详情查看API Key和Secret Key(点击显示查看)
    创建应用

    完成创建

    应用详情

    之后可以选择监控报表来查看应用接口调用情况:
    监控报表

    4、接口调用

    百度AI开放平台提供了人脸识别C#版的详细技术文档,下面以实例来进行简单的调用说明。
    使用人脸检测功能我们添加Baidu.Aip.Face命名空间,定义一个Face变量用于调用API:

    using Baidu.Aip.Face;
    
    private Face client;
    
    client = new Face("API Key", "Secret Key")

    实例化Face变量时需要填写我们创建的应用的API Key和Secret Key,可以在应用详情中查看。
    进行人脸检测时调用FaceDetect方法:

    public JObject FaceDetect(byte[] image, Dictionary<string, object> options = null);

    该方法需要传入两个参数,被检测的图片和返回的参数配置,其中可选参数options可以使用默认值null,这时只会返回人脸的位置等基本信息。返回值是一个JObject类型,此类型是第三方依赖中提供的一个json类型。详细调用方法为:

    byte[] image = File.ReadAllBytes(Application.streamingAssetsPath + "/1.jpg");
    Dictionary<string, object> options = new Dictionary<string, object>()
    {
        {"face_fields", "beauty,age,expression,gender" }
    };
    client.FaceDetect(image, options);

    options中的face_fields为请求的参数,类型是string,多个项以逗号分开,不能加在逗号和后一项之间加空格,否则无效。详细参数如下表:

    参数 类型 描述
    face_fields string 包括age、beauty、expression、faceshape、gender、gla-sses、landmark、race、qualities信息,逗号分隔,默认只返回人脸框、概率和旋转角度。
    max_face_num number 最多处理人脸数目,默认值1
    image byte[] 图像数据

    方法返回的JObject包含一个或多个人脸的信息,也可以如下调用:

    client.FaceDetect(image);

    此时将只会返回最基本的信息,包括日志id,人脸数目,人脸位置,人脸置信度,竖直方向转角,三维左右旋转角,三维俯仰角,平面旋转角。
    所有返回值见下表:

    参数 类型 是否一定输出 描述
    log_id number 日志id
    result_num number 人脸数目
    result array 人脸属性对象的集合
    +age number 年龄。face_fields包含age时返回
    +beauty number 美丑打分,范围0-1,越大表示越美。face_fields包含beauty时返回
    +location array 人脸在图片中的位置
    ++left number 人脸区域离左边界的距离
    ++top number 人脸区域离上边界的距离
    ++width number 人脸区域的宽度
    ++height number 人脸区域的高度
    +face_probability number 人脸置信度,范围0-1
    +rotation_angle number 人脸框相对于竖直方向的顺时针旋转角,[-180,180]
    +yaw number
    +pitch number 三维旋转之俯仰角度[-90(上), 90(下)]
    +roll number 平面内旋转角[-180(逆时针), 180(顺时针)]
    +expression number 表情,0,不笑;1,微笑;2,大笑。face_fields包含expression时返回
    +expression_probability number 表情置信度,范围0~1。face_fields包含expression时返回
    +faceshape array 脸型置信度。face_fields包含faceshape时返回
    ++type string 脸型:square/triangle/oval/heart/round
    ++probability number 置信度:0~1
    +gender string male、female。face_fields包含gender时返回
    +gender_probability number 性别置信度,范围0~1。face_fields包含gender时返回
    +glasses number 是否带眼镜,0-无眼镜,1-普通眼镜,2-墨镜。face_fields包含glasses时返回
    +glasses_probability number 眼镜置信度,范围0~1。face_fields包含glasses时返回
    +landmark array 4个关键点位置,左眼中心、右眼中心、鼻尖、嘴中心。face_fields包含landmark时返回
    ++x number x坐标
    ++y number y坐标
    +landmark72 array 72个特征点位置,示例图 。face_fields包含landmark时返回
    ++x number x坐标
    ++y number y坐标
    +race string yellow、white、black、arabs。face_fields包含race时返回
    +race_probability number 人种置信度,范围0~1。face_fields包含race时返回
    +qualities array 人脸质量信息。face_fields包含qualities时返回
    ++occlusion array 人脸各部分遮挡的概率, [0, 1] (待上线)
    +++left_eye number 左眼
    +++right_eye number 右眼
    +++nose number 鼻子
    +++mouth number
    +++left_cheek number 左脸颊
    +++right_cheek number 右脸颊
    +++chin number 下巴
    ++type array 真实人脸/卡通人脸置信度
    +++human number 真实人脸置信度,[0, 1]
    +++cartoon number 卡通人脸置信度,[0, 1]

    运行时可能会报错:
    运行报错
    这是网页端身份安全验证失败导致的,我们需要在程序运行时手动添加安全证书,在Awake方法中加入:

    System.Net.ServicePointManager.ServerCertificateValidationCallback +=
                   delegate (object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate,
                               System.Security.Cryptography.X509Certificates.X509Chain chain,
                               System.Net.Security.SslPolicyErrors sslPolicyErrors)
                    {
                       return true; // **** Always accept
                    };

    我们可以用Text控件来查看具体的返回值:
    TestFace.cs:

    using System.Collections.Generic;
    using System.IO;
    using Baidu.Aip.Face;
    using UnityEngine;
    using UnityEngine.UI;
    
    public class TestFace : MonoBehaviour
    {
    
        public Text debugInfo;
    
        private Face client;
        private byte[] image;
        private Dictionary<string, object> options;
    
        private void Awake()
        {
            System.Net.ServicePointManager.ServerCertificateValidationCallback +=
                   delegate (object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate,
                               System.Security.Cryptography.X509Certificates.X509Chain chain,
                               System.Net.Security.SslPolicyErrors sslPolicyErrors)
                   {
                       return true; // **** Always accept
                };
    
            client = new Face("API Key", "Secret Key");
            image = File.ReadAllBytes(Application.streamingAssetsPath + "/1.jpg");
            options = new Dictionary<string, object>()
            {
                {"face_fields", "beauty,age,expression,gender" }
            };
        }
    
        public void StartDetect()
        {
            var result = client.FaceDetect(image);//, options);
            debugInfo.text = result.ToString();
        }
    }

    运行结果:
    运行结果

    By:蒋志杰

    展开全文
  • 最近项目需要定位,所以开始来研究Unity的定位,本来想用原生的sdk,但是谷歌被墙了那就没有办法了,接第三方的sdk又太麻烦,百度了一下正好可以通过百度地图API来获取当前IP的地址,不仅是百度地图,同时高德地图,...

           最近项目需要定位,所以开始来研究Unity的定位,本来想用原生的sdk,但是谷歌被墙了那就没有办法了,接第三方的sdk又太麻烦,百度了一下正好可以通过百度地图API来获取当前IP的地址,不仅是百度地图,同时高德地图,腾讯地图等等也都有类似的API,此次我选择了百度地图,于是在查询了百度地图的相关接口后研究出功能,自学记录一下

           代码如下:

    using Newtonsoft.Json;
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    using System.Net.NetworkInformation;
    
    
    public class BaiduTest : MonoBehaviour {
    
    
        public Text province;
        public Text city;
    
        string url = "http://api.map.baidu.com/location/ip?ak=bretF4dm6W5gqjQAXuvP0NXW6FeesRXb&coor=bd09ll";
        string text;
    
        void Start()
        {
            StartCoroutine(Request());
        }
    
        // Update is called once per frame
        void Update()
        {
    
        }
        IEnumerator Request()
        {
            WWW www = new WWW(url);
            yield return www;
    
            if (string.IsNullOrEmpty(www.error))
            {
                Debug.Log(www.text);
                ResponseBody req = JsonConvert.DeserializeObject<ResponseBody>(www.text);
                Debug.Log("夭寿啦,调到地址啦!!!!!!");
                Debug.Log(req.content.address_detail.city);
                province.text = req.content.address_detail.province;
                city.text = req.content.address_detail.city;
            }
        }
    
    }
    
    public class ResponseBody
    {
    
        public string address;
        public Content content;
        public int status;
    
    }
    
    public class Content
    {
        public string address;
        public Address_Detail address_detail;
        public Point point;
    }
    public class Address_Detail
    {
        public string city;
        public int city_code;
        public string district;
        public string province;
        public string street;
        public string street_number;
        public Address_Detail(string city, int city_code, string district, string province, string street, string street_number)
        {
            this.city = city;
            this.city_code = city_code;
            this.district = district;
            this.province = province;
            this.street = street;
            this.street_number = street_number;
        }
    }
    public class Point
    {
        public string x;
        public string y;
        public Point(string x, string y)
        {
            this.x = x;
            this.y = y;
        }
    }

     

           需要注意的是,需要引入Json解析,刚好有现成的插件,导入进去运行成功,不过稍有遗憾的是,我只定位到了省份和城市,不知道是不是IP的问题,通过此API调用IP地址的话精度不是太高,如果需要精度很高的定位的话,建议还是安装第三方SDK,调用的网址是"http://api.map.baidu.com/location/ip?ak=bretF4dm6W5gqjQAXuvP0NXW6FeesRXb&coor=bd09ll";  需要替换自己的AK的话将其中的bretF4dm6W5gqjQAXuvP0NXW6FeesRXb替换成自己的就可以了,具体调用百度地图API有详细解释,在这里就不多做介绍了,下面是我的工程文件,unity版本为5.3.6,在Editor和Android环境下都可以正常运行调用,里面还有些获取IP和调用安卓的代码,在此就不做介绍了。

     

           最后放一下工程文件的链接:  https://download.csdn.net/download/abc1090275833/10586792

    展开全文
  • 使用百度API进行人脸识别
  • Unity3D圣典-中文

    2020-07-30 23:31:51
    压缩包里包涵3个内容: 圣典中文用户手册、unity3d中文apiUnity3d_Script
  • Unity调用百度地图(可实现模型、UI覆盖)

    万次阅读 热门讨论 2017-02-23 18:07:21
    工程下载地址:(需要申请百度地图的APIKey填入网页代码中) 相信如果在看我这篇博客的朋友应该都已经将度娘上【Unity】+【百度地图】下的搜索结果的都看过一遍了,大概列举一下: 1、使用百度地图的Android SDK,...
  • 本书是国内第一本以面向对象和项目流程开发角度,全面系统介绍 Unity3D 的书籍。 本书以具体项目结构开发的角度,结合 Unity3D 层级式的综合开发环境、视觉化编辑、详 细的属性编辑器和动态的游戏预览的特点,在软件...
  • Unity3d+百度AI 实现摄像头画面实时手势识别

    千次阅读 热门讨论 2018-10-19 16:09:24
    本文将讲到,如何利用百度ai的人体分析sdk在unity中实现摄像头实时画面的手势识别 工程链接在文末   (本人使用的是unity2018,unity2017以上都可以,不然.NET版本不支持) 1.准备工作:首先在百度AI的官网,...
  • 转自洪流学堂 语音转文字 1.打开麦克风记录 ...2.将Unity的AudioClip数据转化为PCM格式16bit数据 /// &lt;summary&gt; /// 将Unity的AudioClip数据转化为PCM格式16bit数据 /// ...
  • android项目把BaiduUnityPlugin.unitypackage import进unity3d工程即可 然后把baidudemo.cs 复制到项目中,并修改里面的baidu 广告参数,然后把baidudemo.cs 拖到main camera 或者其他常在场景中的物件上 IOS下使用...
  • Unity常用的API教程,适合有一点基础的同学深入脚本开发学习。
  • //调用Unity内置的打开所在文件夹API Application.OpenURL("file:///" + Application.dataPath);
  • Unity3d菜鸟入门的学习路线--笔记1

    万次阅读 2018-05-23 16:17:39
    最近刚刚开始接触unity3d,因此想把自己的学习路线记录下来,方便自己以后总结。由于毕业论文的关系,需要使用Unity3D开发,做虚拟现实的应用,使用的设备是HTC vive pro产品。初始学习,由于没有基础,因此一团乱,...
  • unity 使用百度语音进行语音识别

    千次阅读 2017-10-27 09:23:24
    新建脚本,将下列代码复制进去即可, using LitJson; using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Text; using UnityEngine;...public cla
  • unity接入百度ai通用文字识别功能,解决网络异常问题,亲测可用,互相学习互相学习
1 2 3 4 5 ... 20
收藏数 1,388
精华内容 555
关键字:

unity3d百度api