Unity常用代码功能总结

 一、代码模版

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;
    }

猜你喜欢

转载自blog.csdn.net/qq_30867987/article/details/82752782
今日推荐