はじめに
シリアル通信を行う際などに使用可能なポート番号がInspectorで一覧表示されたら便利だと思い実装しました。
実装
SerialPortNameAttribute.cs
using UnityEngine;
public class SerialPortNameAttribute : PropertyAttribute
{}
SerialPortNameEditor.cs
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using UnityEditor;
using UnityEngine;
[CustomPropertyDrawer(typeof(SerialPortNameAttribute))]
public class SerialPortNameEditor : PropertyDrawer
{
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
List<string> ports = SerialPort.GetPortNames().ToList();
ports.Sort((a,b) =>
{
return int.Parse(a.Replace("COM", "")) - int.Parse(b.Replace("COM",""));
});
int curPortIndex = 0;
for (int i = 0; i < ports.Count; i++)
{
if (ports[i].Equals(property.stringValue)) curPortIndex = i;
}
curPortIndex = EditorGUI.Popup(position,"PortName",curPortIndex,ports.ToArray());
property.stringValue = ports[curPortIndex];
}
}
使い方
ポート番号を取得したいstring型のフィールドに[SerialPortName]
を付与してください。
※ private
なフィールドの場合は[SerializeField]
も同時に付与してください。
記述例
[SerializeField,SerialPortName]
private string portName;