一、代码模版
1.单例模式代码
//单例模式
static Resource _instance;
void Awake()
{
_instance = this;
}
public static Resource Instance
{
get
{
// 不需要再检查变量是否为null
return _instance;
}
}
2.触控
using UnityEngine.Events;
using UnityEngine.EventSystems;
//添加触控监听类
protected void AddTriggersListener(GameObject obj, EventTriggerType eventType, UnityAction<BaseEventData> action)
{
//首先判断对象是否已经有EventTrigger组件,若没有那么需要添加
EventTrigger trigger = obj.GetComponent<EventTrigger>();
if (trigger == null)
{
trigger = obj.AddComponent<EventTrigger>();
}
//实例化delegates
if (trigger.triggers.Count == 0)
{
trigger.triggers = new List<EventTrigger.Entry>();
}
//定义所要绑定的事件类型
EventTrigger.Entry entry = new EventTrigger.Entry();
//设置事件类型
entry.eventID = eventType;
//定义回调函数
UnityAction<BaseEventData> callback = new UnityAction<BaseEventData>(action);
//设置回调函数
entry.callback.AddListener(callback);
//添加事件触发记录到GameObject的事件触发组件
trigger.triggers.Add(entry);
}
AddTriggersListener(gameObject, EventTriggerType.PointerDown, HiddenOther);
//函数实现
protected void HiddenOther(BaseEventData eventData)
{
//具体功能
}
使用此功能必须在主相机下添加组件Physics Raycaster.
二、小功能
1.格式转换
1.1int与string互换
int a;string c;
int转string:c = a.ToString();
string转Int:intA = int.Parse(str);
int.TryParse(str, out intA);
intA = Convert.ToInt32(str);
int.Parse()是一种类容转换;表示将数字内容的字符串转为int类型。 如果字符串为空,则抛出ArgumentNullException异常; 如果字符串内容不是数字,则抛出FormatException异常; 如果字符串内容所表示数字超出int类型可表示的范围,则抛出OverflowException异常; int.TryParse 与 int.Parse 又较为类似,但它不会产生异常,转换成功返回 true,转换失败返回 false。最后一个参数为输出值,如果转换失败,输出值为 0
三、网络通信
1.C++与Unity通信
c++代码:
while (true)
{
bool tBreak = false;
do {
char receiveChar[4] = { 0 };
//接收信息,只有收到信息才能继续执行,否则等待
int receiveInt = recv(clientSocket, receiveChar, 4, 0);
if (receiveInt <= 0)
{
tBreak = true;
break;
}
m_mutex.lock(); //加锁
//数据转换
INT32 tempData[240];
int tempCount = sendDataTempSave.size();
for (int i = 0; i < tempCount * 3; i += 3)
{
tempData[i] = sendDataTempSave[i / 3].depth.x;
tempData[i + 1] = sendDataTempSave[i / 3].depth.y;
tempData[i + 2] = sendDataTempSave[i / 3].shapeInt;
}
for (int i = tempCount * 3; i < 240; i++)
{
tempData[i] = 0;
}
tempData[239] = sendDataTempSave.size();
m_mutex.unlock(); //解锁
//发送数据
int sendCount = send(clientSocket, (char*)tempData, 240 * sizeof(INT32), 0);
if (sendCount <= 0)
{
tBreak = true;
break;
}
} while (0);
if (tBreak)
break;
}
unity代码:
using System.Net;
using System.Net.Sockets;
void Start()
{
ConnectToServer();//建立连接
}
// Update is called once per frame
void Update()
{
if(startAccept)
{
//发送数据
byte[] a = { 0,1,2,3 };
int sendLength = clientSocket.Send(a);
if (sendLength <= 0)
{
clientSocket.Close();
}
//接收数据
int length = clientSocket.Receive(data);
if (length <= 0)
{
clientSocket.Close();
}
if (length == 960)
{
Int32 t = BitConverter.ToInt32(data, 239 * sizeof(Int32));
Int32 t1 = BitConverter.ToInt32(tempSave, 239 * sizeof(Int32));
if (t != t1)
{
tempCount++;
if (tempCount > 200)
{
tempCount = 0;
data.CopyTo(tempSave, 0);
DataAnalyse(); //数据处理
}
}
else
{
tempCount = 0;
if(t != vehicle0+ vehicle1+ vehicle2)
DataAnalyse(); //数据处理
}
}
}
}
void ConnectToServer()
{
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//发起连接
clientSocket.Connect(new IPEndPoint(IPAddress.Parse(IpAdress), port));
//Debug.Log("连接成功");
startAccept = true;
}