使用Unity调用派样机技术小结

距离这个开发这个项目已经过去差不多两年时间了,今天我闲来无事清理电脑里项目的时候无意看到了这个项目。已经都过去将近两年时间了,时光荏苒啊!两年前的自己也是一个冲动的年轻人,拼了命的做项目,现在想想自己,年轻人还是真年轻呀。算了,废话不多说,今天在这里总结一下调用派样机的开发流程。

一、需求梳理

当时公司让实现一个什么样的功能呐?就是在派样机(类似于饮料自动购物机那种机器)上的电脑上,开发一款Unity程序,这款程序上有一个二维码,用户用微信扫一扫扫这个二维码,这时用户的手机上就会出现一个互动的小程序,用户互动完成后,服务器判断用户互动完成,给派样机的Unity程序发一个网络指令。Unity程序收到该指令后,使用串口通信给派样机发一个指令,派样机硬件收到该指令后,即调用硬件推出一个小礼物,送给用户。

这个项目不是什么很复杂的项目,这里面有两个难点。1.获取服务器传过来的信号,进行判断。2.判断完毕服务器的信号后,调用派样机,调用硬件进行派样。只要开发完成这两个功能后,这个项目就算是完成了。

二、开发步骤

1.首先在Unity中创建UI,将二维码贴在Unity的程序里的UI上,UI如下图所示。

2.开发获取服务器指令功能,并且进行判断,如果获取到正确的信息,即对派样机发送派样指令,代码如下。

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using Newtonsoft.Json;
using UnityEngine.UI;public class HttpNet : MonoBehaviour
{Action callback;/// <summary>/// 派样机字符类/// </summary>public ComManager comManager;// Start is called before the first frame updatevoid Start(){callback += Dispchater;StartCoroutine(GetData(callback));}private void Dispchater(){//Debug.Log("掉小样!");comManager.DemoMechineSendCom();}//加载路径图片IEnumerator GetData(Action action)//Action action{while (true){yield return new WaitForSeconds(2.0f);UnityWebRequest unityWebRequest = UnityWebRequest.Get("https://www.brandxspace.com/development/sendPrototype/getPrototypeState?flag=0");//UnityWebRequest unityWebRequest = UnityWebRequest.Get(jsonUrl);yield return unityWebRequest.SendWebRequest();if (!unityWebRequest.isNetworkError){string data = unityWebRequest.downloadHandler.text;Data d = JsonConvert.DeserializeObject<Data>(data);if (d != null){Debug.Log(data + "------");if (d.status == "1"){//掉小样if (action != null){action();}}}}}}
}
public class Data
{public string status;public String message;public object data;
}

3.开发调用派样机派样功能,该功能主要使用的是串口通信开发,如果对串口通信开发很熟悉的话这个也是十分简单的功能,主要是通过代码设置派样的顺序和速率,代码如下:
(1)CRC.CS

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;public class CRC
{#region  CRC16public static byte[] CRC16(byte[] data){int len = data.Length;if (len > 0){ushort crc = 0xFFFF;for (int i = 0; i < len; i++){crc = (ushort)(crc ^ (data[i]));for (int j = 0; j < 8; j++){crc = (crc & 1) != 0 ? (ushort)((crc >> 1) ^ 0xA001) : (ushort)(crc >> 1);}}byte hi = (byte)((crc & 0xFF00) >> 8);  //高位置byte lo = (byte)(crc & 0x00FF);         //低位置return new byte[] { hi, lo };}return new byte[] { 0, 0 };}#endregion#region  ToCRC16public static string ToCRC16(string content){return ToCRC16(content, Encoding.UTF8);}public static string ToCRC16(string content, bool isReverse){return ToCRC16(content, Encoding.UTF8, isReverse);}public static string ToCRC16(string content, Encoding encoding){return ByteToString(CRC16(encoding.GetBytes(content)), true);}public static string ToCRC16(string content, Encoding encoding, bool isReverse){return ByteToString(CRC16(encoding.GetBytes(content)), isReverse);}public static string ToCRC16(byte[] data){return ByteToString(CRC16(data), true);}public static string ToCRC16(byte[] data, bool isReverse){return ByteToString(CRC16(data), isReverse);}#endregion#region  ToModbusCRC16public static string ToModbusCRC16(string s){return ToModbusCRC16(s, true);}public static string ToModbusCRC16(string s, bool isReverse){return ByteToString(CRC16(StringToHexByte(s)), isReverse);}public static string ToModbusCRC16(byte[] data){return ToModbusCRC16(data, true);}public static string ToModbusCRC16(byte[] data, bool isReverse){return ByteToString(CRC16(data), isReverse);}#endregion#region  ByteToStringpublic static string ByteToString(byte[] arr, bool isReverse){try{byte hi = arr[0], lo = arr[1];return Convert.ToString(isReverse ? hi + lo * 0x100 : hi * 0x100 + lo, 16).ToUpper().PadLeft(4, '0');}catch (Exception ex) { throw (ex); }}public static string ByteToString(byte[] arr){try{return ByteToString(arr, true);}catch (Exception ex) { throw (ex); }}#endregion#region  StringToHexStringpublic static string StringToHexString(string str){StringBuilder s = new StringBuilder();foreach (short c in str.ToCharArray()){s.Append(c.ToString("X4"));}return s.ToString();}#endregion#region  StringToHexByteprivate static string ConvertChinese(string str){StringBuilder s = new StringBuilder();foreach (short c in str.ToCharArray()){if (c <= 0 || c >= 127){s.Append(c.ToString("X4"));}else{s.Append((char)c);}}return s.ToString();}private static string FilterChinese(string str){StringBuilder s = new StringBuilder();foreach (short c in str.ToCharArray()){if (c > 0 && c < 127){s.Append((char)c);}}return s.ToString();}/// <summary>/// 字符串转16进制字符数组/// </summary>/// <param name="hex"></param>/// <returns></returns>public static byte[] StringToHexByte(string str){return StringToHexByte(str, false);}/// <summary>/// 字符串转16进制字符数组/// </summary>/// <param name="str"></param>/// <param name="isFilterChinese">是否过滤掉中文字符</param>/// <returns></returns>public static byte[] StringToHexByte(string str, bool isFilterChinese){string hex = isFilterChinese ? FilterChinese(str) : ConvertChinese(str);//清除所有空格hex = hex.Replace(" ", "");//若字符个数为奇数,补一个0hex += hex.Length % 2 != 0 ? "0" : "";byte[] result = new byte[hex.Length / 2];for (int i = 0, c = result.Length; i < c; i++){result[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16);}return result;}#endregion}

(2)ComManager.cs

using UnityEngine;
using System.Collections;
using System;
using System.Threading;
using System.Collections.Generic;
using System.IO.Ports;public class ComManager : MonoBehaviour
{//public ComManager instance;//端口号string com2 = "";private SerialPort sp2;//波特率private int baudRate;public float timer = 0.1f;//private bool isShinning = false;//配置文件管理类public ConfigTest configTest;//private void Awake()//{//instance = this;//}void Start(){//string com2 = "COM7";com2 = configTest.dic["端口号"]["portName"];baudRate = int.Parse(configTest.dic["波特率"]["baudRate"]);//row = 8;row = int.Parse(configTest.dic["参数"]["row"]);//column = 4;column = int.Parse(configTest.dic["参数"]["column"]);//depth = 5;depth = int.Parse(configTest.dic["参数"]["depth"]);mainCount = int.Parse(configTest.dic["参数"]["mainCount"]);StartCoroutine(StartCom());}IEnumerator StartCom(){yield return new WaitForSeconds(0.1f);sp2 = new SerialPort(com2, baudRate, Parity.None, 8, StopBits.One);if (!sp2.IsOpen){sp2.Open();}}/// <summary>/// 派样机串口/// </summary>/// <param name="data"></param>private void SendDemoMechineData(byte[] data){if (sp2.IsOpen){sp2.Write(data, 0, data.Length);}}void OnDisable(){if (sp2.IsOpen){sp2.Close();}}private int row;//8private int column;//5private int depth;//10private int mainCount = 40;//总数private static int index = 0;public void DemoMechineSendCom(){int tempRow = index % row; //第几个int tempColumn = (index / row) % row; //第几行int tempdepth = index / (row * column) % depth;Debug.Log(index + " row: " + tempRow + "col: " + tempColumn + "depth " + tempdepth);string pos = tempColumn.ToString("0") + tempRow.ToString("0");string corPos = System.Convert.ToString(int.Parse(pos),16).PadLeft(2,'0');string data = "0105"+ corPos+ "030000000000000000000000000000";byte[] byteData = CRC.StringToHexByte(data);byte[] crcByteData = CRC.CRC16(byteData);//Debug.Log(CRC.ByteToString(crcByteData));data += CRC.ByteToString(crcByteData);//Debug.Log(data);byte[] byteDatas = CRC.StringToHexByte(data);SendDemoMechineData(byteDatas);index++;if (index >= mainCount){index = 0;}}
}

三、小结

就这样,派样机的功能就基本开发完成了。虽然这个程序的功能十分简单,但是用处很大,创作不易,如果喜欢文章,请点个赞。另外安利一波本人新开的网店,如果有什么需求自己做的费劲,可以在网店联系我,我会尽力帮助大家,希望大家支持一下。网店地址:https://m.tb.cn/h.fRFp7F4?sm=8c0c06 小程工作室68。

使用Unity调用派样机技术小结相关推荐

  1. AJAX编写用户注册实例及技术小结

    这个例子是一个企业用户注册时的一个应用,当用户注册时检查用户名和企业名是否可用,以前的做法是在旁边加一个按钮,点击"检查",就向服务器发出请求,然后等待--服务器返回信息,继续操作 ...

  2. 游戏服务器开发技术小结

    转载请自觉标明原创出处 原文链接:http://gameislife.info/archives/category/游戏开发    游戏服务器开发技术小结 1 概述 本文从开发者的视角,浅析游戏服务器 ...

  3. ole db提供程序 mysql_服务器_SQLServer的链接服务器技术小结,一、使用 Microsoft OLE DB Provider F - phpStudy...

    SQLServer的链接服务器技术小结 一.使用 Microsoft OLE DB Provider For ODBC 链接MySQL 安装MySQL的ODBC驱动MyODBC 1.为MySQL建立一 ...

  4. Unity HybridCLR热更新技术实现

    最近我们在项目中遇到了一个问题:经常需要修改游戏逻辑,如果每次修改都需要重新打包发布,那将会非常耗时,于是我们开始寻找解决方案.最后我们找到了 Unity HybridCLR 热更新技术,实现了游戏逻 ...

  5. 《Unity 3D 游戏开发技术详解与典型案例》——1.1节Unity 3D基础知识概览

    本节书摘来自异步社区<Unity 3D 游戏开发技术详解与典型案例>一书中的第1章,第1.1节Unity 3D基础知识概览,作者 吴亚峰 , 于复兴,更多章节内容可以访问云栖社区" ...

  6. FPGA Configuration 技术小结

    Xilinx FPGA Configuration 技术小结 做了三年四个项目最近才第一次需要深入的搞一下FPGA 烧写.在这里简单总结一下FPGA烧写的具体过程和玩的花样 大家常用的办法 对于大部分 ...

  7. Unity调用外部摄像头/网络摄像头/手机摄像头

    基于WebCamTexture WebCamTexutre可以支持采集卡.网络摄像头和移动端(手机.平板)设备摄像头的捕获一般代码会如下写: using System.Collections; usi ...

  8. Unity调用安卓Android的Toast

    需求:在游戏中弹窗消息,调起安卓的Toast 项目中需要做Unity和安卓交互时,经常需要通过安卓Toast来做简单的输出,以便于测试. 方法一:Unity中,C#主导 // Unity调用安卓的土司 ...

  9. UNITY调用安桌方法出现 JNI: Init'd AndroidJavaClass with null ptr!

    UNITY调用安桌方法出现 JNI: Init'd AndroidJavaClass with null ptr! 原因是····· 得运行在一个真正的Android设备上! 得运行在一个真正的And ...

最新文章

  1. 不用3D建模软件,如何用数学公式创造一个女孩?会眨眼,有光影的那种
  2. BZOJ 4327 [JSOI2012]玄武密码 (AC自动机)
  3. 网络克隆报a:\ghosterr.txt故障解决一例
  4. 远控免杀专题(22)-SpookFlare免杀
  5. Java学习笔记10-1——MyBatis
  6. Python中字符串的startswith()和endswith()方法
  7. Tomcat(Install)
  8. Spring安全权限管理(Spring Security的配置使用)
  9. java 观察者模式_观察者模式(Observer Pattern)
  10. Linux设置bypass网卡,Linux pwn入门教程(7)——PIE与bypass思路
  11. 伟大时刻:小米的命门
  12. POJ 3253.Fence Repair
  13. 自媒体运营技巧之抖音快手怎么上热门
  14. 如何通过KRPano全景资源下载助手来批量下载720yun的全景图
  15. 行存与列存的简单对比
  16. R语言:根据经纬度在世界地图上画出各个点
  17. 银河麒麟高级服务器v10 sp2 下fpm工具打包rpm
  18. illustrator插件-拼版功能开发-自动拼版-js脚本开发-ai插件
  19. java腾讯滤镜接口_腾讯内容开放平台
  20. js常用实例:qq。。。

热门文章

  1. MFC学习之 对话框设置背景颜色及控件透明的方法
  2. 003.关于光流传感器(ADNS3080)调焦问题
  3. 最近瞎忙,比较懒撒,所以要收收心,该学习的学习。
  4. 家电企业如何利用APS生产排产应对市场变化调整生产?
  5. 计算机合成音乐的交换标准,音乐合成器
  6. 25个最适合摄影师的WordPress主题(2020)
  7. android2.3.5中阿拉伯文字符显示顺序不是从右至左显示
  8. fork和lockf应用
  9. 增设区域分销商:APC渠道变革拒绝“扁平化”
  10. python杀毒软件程序_使用Python Shells绕过杀毒软件