Unity Arduino完美协作工具Uduino

Unity Arduino完美协作工具之Uduino

  • 前言
  • 环境搭建
    • Unity插件导入部分
    • Arduino代码上传部分
    • Unity场景搭建部分
    • 硬件场景部分
  • 控制代码
  • 使用效果
  • 注意事项

前言

盆友搞了个Uduino插件,正好手边有Unity和Arduino,用按钮和灯泡实现Unity控制Arduino与Arduino控制Unity。

感谢Arduino跟Unity通讯,我的按钮的标准写法

环境搭建

对如何导入插件有疑问的话,建议查看官方视频教程
视频教程: Connect Arduino to Unity in less than 1 minute - Uduino

Unity插件导入部分

将插件导入Unity
Uduino导入Unity

Arduino代码上传部分

将Uduino代码上传至Arduino
将代码上传至Arduino

Unity场景搭建部分

一个Cube(添加刚体组件)与一个Plane
场景

硬件场景部分

灯泡链接GND和11管脚
按键连接GND和2管脚
硬件

控制代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
using System;
using System.Collections;
using System.Collections.Generic;
using Uduino;
using UnityEngine;

public class UduinoTest : MonoBehaviour
{<!-- -->
    /// <summary>
    /// 小灯管脚
    /// </summary>
    int pin11;
    /// <summary>
    /// 按钮管脚
    /// </summary>
    int pin2;

    /// <summary>
    /// Arduino设备
    /// </summary>
    UduinoDevice arduinoDevice;

    public GameObject myCube;


    // Start is called before the first frame update
    void Start()
    {<!-- -->
        //当连接板子时触发
        UduinoManager.Instance.OnBoardConnected += OnArduinoConnected;
    }
   
    /// <summary>
    /// 当板子链接时
    /// </summary>
    private void OnArduinoConnected(UduinoDevice device)
    {<!-- -->
        //拿到pin口
        pin11 = UduinoManager.Instance.GetPinFromBoard("11");
        pin2 = UduinoManager.Instance.GetPinFromBoard("2");
        //设置pin口控制方式
        UduinoManager.Instance.pinMode(pin11, PinMode.PWM);
        UduinoManager.Instance.pinMode(pin2, PinMode.Input_pullup);
    }
   
    float timeCount=0;
    int count;
    bool isUp = true;

    // Update is called once per frame
    void Update()
    {<!-- -->
        Huxideng();
       
        if (UduinoManager.Instance.hasBoardConnected())
        {<!-- -->
            //读取pin口数字量
            int a = UduinoManager.Instance.digitalRead(pin2);
            if (a == 0)
            {<!-- -->
                AddForcesToCube();
            }
        }
    }

    /// <summary>
    /// 给Cube加力
    /// </summary>
    public void AddForcesToCube()
    {<!-- -->
        myCube.GetComponent<Rigidbody>().AddForce(Vector3.up * 2f);
    }

    /// <summary>
    /// 呼吸灯
    /// </summary>
    private void Huxideng()
    {<!-- -->
        if (UduinoManager.Instance.hasBoardConnected())
        {<!-- -->
            timeCount += Time.deltaTime;
            if (timeCount >= 0.01f)
            {<!-- -->
                if (isUp)
                {<!-- -->
                    count++;
                }
                else
                {<!-- -->
                    count--;
                }
                if (count >= 255)
                {<!-- -->
                    count = 255;
                    isUp = false;
                }
                if (count <= 0)
                {<!-- -->
                    count = 0;
                    isUp = true;
                }
                //写入pin口模拟量
                UduinoManager.Instance.analogWrite(pin11, count);
                timeCount = 0;
            }
        }
    }
}

使用效果

小灯为呼吸灯效果,按下按键Unity中的Cube会向上升起,编辑器右下角可以看到管脚传来的值。
Unity界面
这里可以看到灯泡忽明忽暗。
灯泡忽明忽暗

注意事项

当编辑器运行时,注意这两个地方不要有冲突的管脚,会造成0和1交替出现的情况。
注意