2012年4月7日土曜日

Unity WWW (2)

UnityのWWWで、ローカルホストにアクセスするテスト

サーバーにAIMLを実装したJ-Aliceを使用


ボット同士の会話

TestWWW2.cs

using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using UnityEngine;

// テキストフィールドに入力した文字列を、Sendボタンでサーバーに送信
public class TestWWW2 : MonoBehaviour {
    public int  m_nPortNo = 8000;       // ポート番号
    public TestWWW2     m_objTalkTo;    // 話し相手
    
    string      m_InputTxt = "";        // 聞いた内容
    string      m_OutputTxt = "";       // 話した内容
    GameObject  m_objCamera;            // 描画用のカメラ

    public void Start() {
        // カメラを取得
        m_objCamera = GameObject.Find("Main Camera");
    }

    // 話したテキストをセット 話し相手側から呼びだす
    public void SetTaledTxt(string txt) {
        m_InputTxt = txt;
        StartCoroutine( ConnectToLocal( m_InputTxt ) );
    }

    // ローカルサーバーのJ-Aliceに接続
    IEnumerator ConnectToLocal(string inputTxt) {
        // URL引数
        string arg = "?input=" + WWW.EscapeURL(inputTxt);
        // URL
//        string url = "http://localhost:" + m_nPortNo.ToString() + arg;
        string url = "http://127.0.0.1:" + m_nPortNo.ToString() + arg;

        // WWWでURLに接続
        WWW www = new WWW(url);
        yield return www;

        // ShiftJisのエンコーディングを取得
        int codepage = 932;
        Encoding enc = Encoding.GetEncoding( codepage );

        // WWWから文字列を取得
        string str = enc.GetString( www.bytes );

        // J-Aliceからの応答部分の文字列を切り取り 仮
        int nStartIndex = str.IndexOf(":");
        int nEndIndex = str.IndexOf("<p>");
        int nLen = nEndIndex - nStartIndex - 2;
        str = str.Substring(nStartIndex + 2, nLen);

        m_OutputTxt = str;          // 描画するテキストをセット

        // 表示フラグ変更用のウェイト開始
        StartCoroutine( WaitOutputTxt() ); 
    }

    IEnumerator WaitOutputTxt() {
        yield return new WaitForSeconds(3.0f);  // ウェイト

        if(null != m_objTalkTo) {
            // 話相手に話した内容をセット
            m_objTalkTo.SetTaledTxt( m_OutputTxt );
        }
    }

    void OnGUI () {
        // ワールド座標をスクリーン座標に変換
        Vector3 pos = transform.position;
        Vector3 screenPos = m_objCamera.camera.WorldToScreenPoint( pos );

        // 入力文字列編集用のテキストフィールド
        string outTxt = GUI.TextField( new Rect(screenPos.x - 64.0f, 10.0f, 128.0f, 18.0f), m_InputTxt);
        if(0 != outTxt.CompareTo(m_InputTxt)) {
            m_InputTxt = outTxt;
        }

        // 送信ボタン
        if(GUI.Button(new Rect(screenPos.x - 64.0f + 140.0f, 10.0f, 64.0f, 18.0f), "Send")) {
            // コルーチンの開始
            StartCoroutine( ConnectToLocal( m_InputTxt ) );
        }
        // 応答テキストを表示
        GUI.TextArea( new Rect(screenPos.x - 100.0f, 60.0f, 200.0f, 64.0f), m_OutputTxt);
    }
}

0 件のコメント: