我想创建一个对话框,单击一下调用一个类

时间:2015-07-17 01:20:00

标签: c# unity3d

我想创建一个对话框,所以我使用了脚本dialog.cs。我想调用这个脚本,例如,我想单击该对象并显示windows对话框。不幸的是,当我点击对象时,窗口对话框不会出现。

Ps:由于对话脚本是MonoBehaviour,我甚至将它添加到对象中以显示它。

gameObject.AddComponent<Dialog>();

完整dialog.cs

using UnityEngine;
using System.Collections.Generic;

public class Dialog : MonoBehaviour {

    public TextAsset conversationAsset;

    protected string dialogname="";
    public string description="";
    public bool keyTriggered=true;
    public bool restartDialogEachTime=true;
    public string triggerInputKey="Chat";
    public string dialogClass="DialogGuiBasic";
    public float dialogRange=3;
    public GUISkin dialogSkin;
    public Camera dialogCamera=null;
    public Vector2 dialogSize=new Vector2(800,371);
    public Texture2D dialogPortrait=null;
    public float charactersPerSecond=50f;

    private Conversation[] conversations=null;
    private int conversationIndex=0;
    private GameObject playerObject;

    public void Start(){
        LoadDialog();
        playerObject=GameObject.FindWithTag("Player");

        // Add this to the parley list
        Parley.GetInstance().GetDialogs().Add(dialogname,this);
    }

    public int GetConversationIndex(){
        return conversationIndex;
    }

    public void SetConversationIndex(int conversationIndex){
        this.conversationIndex=conversationIndex;
    }

    public Conversation[] GetConversations(){
        return conversations;
    }

    protected void LoadDialog(){
        dialogname=conversationAsset.name.Substring(4);
        Debug.Log("name=["+dialogname+"]");
        // Load from Text Asset
        string[] lines = conversationAsset.text.Split("\n"[0]);
        int l=0;

        conversations=new Conversation[int.Parse(lines[l++])];

        for (int c=0;c<conversations.Length;c++){
            l++;
            Conversation co=new Conversation();
            conversations[c]=co;

            co.id=int.Parse(lines[l++]);
            co.returnId=int.Parse(lines[l++]);
            co.returnDialogName=lines[l++];
            co.text=null;           
            for (string text=lines[l++];!text.Equals(Conversation.BREAK);text=lines[l++]){
                if (co.text!=null){
                    co.text+="\n";
                }
                co.text+=text;
            }

            co.repeattext=null;
            for (string text=lines[l++];!text.Equals(Conversation.BREAK);text=lines[l++]){
                if (co.repeattext!=null){
                    co.repeattext+="\n";
                }
                co.repeattext+=text;
            }

            co.once=bool.Parse(lines[l++]);
            co.fallthrough=bool.Parse(lines[l++]);
            co.questevent=lines[l++];

            co.playerCommands=new Command[int.Parse(lines[l++])];
            for (int ct=0;ct<co.playerCommands.Length;ct++){
                Command command=new Command();
                co.playerCommands[ct]=command;

                command.objectName=lines[l++];
                command.method=lines[l++];
                command.assignment=("true".Equals(lines[l++]));
                command.paramaters=new string[int.Parse(lines[l++])];
                for (int pt=0;pt<command.paramaters.Length;pt++){
                    command.paramaters[pt]=lines[l++];
                }
            }

            co.questrequirement=lines[l++];
            co.environmentalrequirement=lines[l++];
            co._available=bool.Parse(lines[l++]);

            if (co.repeattext==null || co.repeattext.Length==0) co.repeattext=null;
            if (co.questevent==null || co.questevent.Length==0) co.questevent=null;
            if (co.playerCommands==null || co.playerCommands.Length==0) co.playerCommands=null;
            if (co.questrequirement==null || co.questrequirement.Length==0) co.questrequirement=null;

            co.options=new Option[int.Parse(lines[l++])];

            for (int n=0;n<co.options.Length;n++){
                l++;
                Option o=new Option();
                co.options[n]=o;
                o.text=lines[l++];
                for (string text=lines[l++];!text.Equals(Conversation.BREAK);text=lines[l++]){
                    if (o.text!=null){
                        o.text+="\n";
                    }
                    o.text+=text;
                }


                o.destinationId=int.Parse(lines[l++]);
                o.destinationDialogName=lines[l++];
                o._available=bool.Parse(lines[l++]);
                l++;
            }
            l++;
        }
    }

    public void Update(){
        if (triggerInputKey!=null && triggerInputKey.Length>0 && keyTriggered && Input.GetButtonUp(triggerInputKey) && IsInRange() && !Parley.GetInstance().IsInGui()){
            TriggerDialog();
        }
    }

    public bool IsInRange(){
        return Vector3.Distance(transform.position, playerObject.transform.position)<dialogRange; 
    }

    public void TriggerDialog(){
        TriggerDialog(restartDialogEachTime?0:conversationIndex);
    }

    public void TriggerDialog(int start){
        conversationIndex=start;
        if (dialogClass!=null && dialogClass.Trim().Length>0){
            // Make sure we only ever add one gui instance
            MonoBehaviour dialogGuiInstance=(MonoBehaviour)GetComponent(dialogClass);
            if (dialogGuiInstance==null){
                // Add dialog gui now
                gameObject.AddComponent<Dialog>();
            }
        }
        SendMessage("StartDialog",this,SendMessageOptions.RequireReceiver);
    }

    public void TriggerDialogEnd(){
        if (dialogClass!=null && dialogClass.Trim().Length>0){
            MonoBehaviour dialogGuiInstance=(MonoBehaviour)GetComponent(dialogClass);
            if (dialogGuiInstance!=null){
                // Delete the Dialog Gui script
                Destroy(dialogGuiInstance);
            }
        }
    }

    public void OnDrawGizmos(){
        if (conversationAsset!=null){
            Gizmos.DrawIcon (transform.position-new Vector3(0,-dialogRange/3,0),"ParleyDialog.png");
        }
    }

    public void OnDrawGizmosSelected () {
        if (conversationAsset!=null){
            Gizmos.color = Color.yellow;
            Gizmos.DrawWireSphere (transform.position, dialogRange);
        }
    }

1 个答案:

答案 0 :(得分:0)

Unity 5有一些重大的API更改。

而不是自动转换的行看起来像:

UnityEngineInternal.APIUpdaterRuntimeServices.AddComponent(gameObject, "Assets/Parley Assets/Scripts/Dialog.cs (150,5)", dialogClass);

Unity有关于此api更改的博客文章

//This will add the dialog, so, And now the window will show up!
gameObject.AddComponent<dialog>();

由于对话脚本是MonoBehaviour,我将其添加到对象中以显示它。

但是当我点击对象时它不会显示任何窗口对话框。