【VRChat】クリップボードの内容を表示する平面オブジェクトを作ろうとした話【ChatGPT】2
相変わらず挫折を続けています!!だがしかし元気!!
現在のプロンプトと回答を載せます。もうスクリプトが悪いとかじゃなくて、自分のUnityの操作方法への理解が少ないのも原因でなかなか進んでいません。というよりこの機能、許可されてなかったりするんですかね??
Q.VRChatでOSCを利用して、アバターに持たせた平面オブジェクトにWindowsのクリップボードの画像を更新する度に表示し、画像サイズによってオブジェクトのサイズを可変させるシステムを作ります。 条件としては、 ・Unityのバージョンは2019.4.31f1 ・最新のホワイトリスト(https://docs.vrchat.com/docs/whitelisted-avatar-components)を参照して作成してください ・OscCoreのOSC Reciever、OSC Senderを利用してください ・OscMessageの部分はOscMessageValuesやOscMessageValues.Stringなど、直接指定して作成してください
A.VRChatでアバターに持たせた平面オブジェクトにWindowsのクリップボードの画像を表示し、画像サイズによってオブジェクトのサイズを可変させるシステムを作るために、以下の手順を実行してください。
Unityプロジェクトを開き、Unityのバージョンを2019.4.31f1に設定します。
VRChat SDK3をインポートします。
OscCoreをインポートします。これにより、OSC ReceiverとOSC Senderが利用可能になります。
アバターに持たせる平面オブジェクトを作成し、適切な位置に配置します。
平面オブジェクトにOSC Receiverコンポーネントを追加します。OSCアドレスを設定し、適切なポート番号を指定します。
OSC Senderコンポーネントを追加し、適切なIPアドレスとポート番号を指定します。
以下のC#スクリプトを作成し、平面オブジェクトにアタッチします。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using OscCore;
using System.IO;
using UnityEngine.UI;
public class ClipboardImageReceiver : MonoBehaviour
{
public OscReceiver Receiver;
public OscSender Sender;
public string OscAddress = "/clipboardImage";
public RawImage ImageDisplay;
private void Start()
{
Receiver.Bind(OscAddress, OnReceiveImage);
}
private void OnReceiveImage(OscMessageValues values)
{
string base64Image = values.ReadString(0);
byte[] imageData = System.Convert.FromBase64String(base64Image);
Texture2D texture = new Texture2D(2, 2);
texture.LoadImage(imageData);
ImageDisplay.texture = texture;
ImageDisplay.rectTransform.sizeDelta = new Vector2(texture.width, texture.height);
}
}
8.スクリプトのインスペクターで、OSC Receiver、OSC Sender、およびRawImageコンポーネントを適切に設定します。
9.Windows側でクリップボードの画像を取得し、OSCメッセージとして送信するためのPythonスクリプトを作成します。
import pyperclip
import base64
import time
from pythonosc import udp_client
client = udp_client.SimpleUDPClient("127.0.0.1", 9000) # OSC SenderのIPアドレスとポート番号を指定
osc_address = "/clipboardImage"
while True:
try:
image = pyperclip.image()
if image is not None:
with open("temp_image.png", "wb") as f:
image.save(f, "PNG")
with open("temp_image.png", "rb") as f:
img_data = f.read()
base64_img = base64.b64encode(img_data).decode("utf-8")
client.send_message(osc_address, base64_img)
except Exception as e:
print(e)
time.sleep(1)
10.Pythonスクリプトを実行し、クリップボードの画像が変更されるたびに、アバターの平面オブジェクトに表示されることを確認します。
これで、VRChatでアバターに持たせた平面オブジェクトにWindowsのクリップボードの画像を表示し、画像サイズによってオブジェクトのサイズを可変させるシステムが完成しました。
コードのやり取りというよりは、プロンプトの追加編集を主にしたほうがなんとかなるというのが実感です。回答を進めていくとエラーのループなどが起こるのできちんと自分で判断しながら、ChatGPTの回答を確認していくのが重要ってことですね。