2012年9月13日木曜日

Unity コピー&ペーストを実現するには?


Web Playerなど、Unity開発でコピー&ペーストに対応していない場合、標準では対応していないために困る。ただし代わりにスクリプトで対応する方法があるとの情報があったため、紹介することにした。

Unity公式フォーラムからの回答を翻訳してみた:

http://answers.unity3d.com/questions/266244/how-can-i-add-copypaste-clipboard-support-to-my-ga.html

Jun 25 at 04:37 PM

コピー&ペースト機能としてCtrl+C, Ctrl+V(Macコマンド)をアプリケーションに機能をもたせたい。理想的にはポップアップメニューで右クリックできるかもしれないがその解決方法は時間がかかりそうなので何かクリッポボード上のコンテンツをゲームに入れ込む手段さえあればよいと考えている。

たとえば.NETの場合はSystem.Windows.Clipboardを使うのだけれど、System.Windows名前空間はUnity(たぶんMonoも同様)で使用不可だから困っている。何か良い方法ないだろうか?

リフレクション使用すれば、GUIUtilityのプライベートメンバーを参照することで実現できるね。自分も調べたソース元が分からないけど、以下のスクリプトを使用すれば実現できるよ。

// C#
// ClipboardHelper.cs
using UnityEngine;
using System;
using System.Reflection;

public class ClipboardHelper
{
    private static PropertyInfo m_systemCopyBufferProperty = null;
    private static PropertyInfo GetSystemCopyBufferProperty()
    {
       if (m_systemCopyBufferProperty == null)
       {
         Type T = typeof(GUIUtility);
         m_systemCopyBufferProperty = T.GetProperty("systemCopyBuffer", BindingFlags.Static | BindingFlags.NonPublic);
         if (m_systemCopyBufferProperty == null)
          throw new Exception("Can't access internal member 'GUIUtility.systemCopyBuffer' it may have been removed / renamed");
       }
       return m_systemCopyBufferProperty;
    }
    public static string clipBoard
    {
       get 
       {
         PropertyInfo P = GetSystemCopyBufferProperty();
         return (string)P.GetValue(null,null);
       }
       set
       {
         PropertyInfo P = GetSystemCopyBufferProperty();
         P.SetValue(null,value,null);
       }
    }
}

----------

ちなみに、NGUIでも作者に「これ使って実装してもらえない?」と聞いた方がいるようだったが残念ながらドキュメントないので実装できないとの返事だった様子。
使用するなら自己責任の範囲で、とのことか。

Unityで色々な機能をテストしてカスタマイズしよう!

0 件のコメント:

コメントを投稿

ブックマークに追加

このエントリーをはてなブックマークに追加

自己紹介

自分の写真
Unity3D公式マニュアル翻訳やってる人がスマホ(iPhone, Android)のゲーム開発しています。気軽に面白く初心者が遊べる内容がモットー。Blogでは開発情報をひたすら、Twitterではゲーム作成の過程で参考にしている情報を中心につぶやきます

ページビューの合計

過去7日間の人気投稿

ブログ アーカイブ