声控Unity3D动画

用的WEGASUN-M6语音识别模块,有两对串口,因其发出的都是十六进制字节,经过测试上一篇https://blog.csdn.net/weixin_44345862/article/details/97368139 “Unity3D与arduino串口通讯”中的readline方法(读字符串用的)在这里无法使用。所以串口交互代码也有所改变。

模块设置的控制词如下:
在这里插入图片描述
Unity3D元素,可实现前进,后退,左转,右转。两个模型可以同时覆上串口控制程序,但前面的cube受控正常,熊猫只绕某一个轴旋转,不受控。
在这里插入图片描述
代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using System.IO.Ports;
using System;
using System.Threading;
using System.Text;
public class Serialreadtest : MonoBehaviour
{

private SerialPort sp;
private Thread receiveThread;  //用于接收消息的线程
private Thread sendThread;     //用于发送消息的线程
public string portName = "COM6";//串口名
public int baudRate = 9600;//波特率
public Parity parity = Parity.None;//效验位
public int dataBits = 8;//数据位
public StopBits stopBits = StopBits.One;//停止位
byte inputvalue=0;
public float speed = 8;
void Start () {

    OpenPort();
    receiveThread = new Thread(ReceiveThreadfunction);
    receiveThread.IsBackground = true;
    receiveThread.Start();

}

// Update is called once per frame
void Update () {
    Vector3 transformValue = new Vector3();//定义平移向量
    transformValue = Vector3.left * 0;
    int rotateValue = 1;
    int state = 0;
    //       transform.animation.Play("walk");//播放角色行走动画

    if (inputvalue == 0x03)
    {
        state = 3;
        Debug.Log("go ahead ");
    }
    if (inputvalue == 0x04)
    {
        state = 4;
        Debug.Log("go back ");
    }
    if (inputvalue == 0x05)
    {
        state = 5;
        Debug.Log("turn left ");
    }
    if (inputvalue == 0x06)
    {
        state = 6;
        Debug.Log("turn right ");
    }
    if (inputvalue == 0x07)
    {
        state = 7;
        Debug.Log("stop ");
    }
    switch (state)
    {
        case 3://角色状态向前时,角色不断向前缓慢移动
            transformValue = Vector3.forward * Time.deltaTime * speed;
            break;
        case 4://角色状态向后时。角色不断向后缓慢移动
            transformValue = Vector3.back * Time.deltaTime * speed;
            break;
        case 5://角色状态向右时。角色不断向右缓慢移动
            transformValue = Vector3.right * Time.deltaTime * speed;
            break;
        case 6://角色状态向左时,角色不断向左缓慢移动
            transformValue = Vector3.left * Time.deltaTime * speed;
            break;
        case 7://角色状态向左时,角色不断向左缓慢移动
            transformValue = Vector3.left * 0;
            break;
    }
    //       transform.Rotate(Vector3.up, rotateValue);//旋转角色
    transform.Rotate(Vector3.left, rotateValue);//旋转角色
    transform.Translate(transformValue, Space.World);//平移角色
}
#region 创建串口,并打开串口
public void OpenPort()
{
    
     //创建串口
        sp = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
        sp.ReadTimeout = 400;
        try
        {
            sp.Open();
        }
        catch (Exception ex)
        {
            Debug.Log(ex.Message);
        }
    
}
#endregion
#region 程序退出时关闭串口
void OnApplicationQuit()
{
    ClosePort();
}
public void ClosePort()
{
    try
    {
        sp.Close();
        receiveThread.Abort();
    }
    catch (Exception ex)
    {
        Debug.Log(ex.Message);
    }
}
#endregion
private void ReceiveThreadfunction()
{
    byte[] buffer = new byte[128];
    int bytes = 0;
    while (true)
    {
        if (this.sp != null && this.sp.IsOpen)
        {
            /*                try
                            {
                                String strRec = sp.ReadLine();            //SerialPort读取数据有多种方法,我这里根据需要使用了ReadLine()
                                Debug.Log("Receive From Serial: " + strRec);
                            }
             */
            try
            {
                bytes = sp.Read(buffer, 0, buffer.Length);
                for (int i = 0; i < bytes; i++)
                {
                    inputvalue = buffer[i];
                    Debug.Log("Receive From Serial: " + buffer[i]);
                }
             }
            catch
            {
                //continue;
            }
        }
    }
}

}

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值