2017-10-24 4 views
0

プレーヤーが性別を選択し、正しい代名詞で選んだ対話を反映したいゲームを作成します。私はブール値を使うことを考えていましたが、それは、性別の一つが真、もう一つが偽であることを悪くしているように、アドバイスではありませんでした。だから私は唯一の問題は、それを正しく実装し、それを動作させる方法です。実際には文字列に使用する前にenumを使用していませんでした。 文字列とunumの性別代名詞の切り替え

public class UITextBoxScript : MonoBehaviour 
{ 

public Text mytext; 
enum Gender 
{ 
    None, Male, Female 
} 
enum States 
{ 
    Instructions, Warning, YourGender, Test 
} 

Gender playerGender = Gender.None; 

Gender playersGender = Gender.Male; 

Gender playGender = Gender.Female; 


int gender = 0; // using 0 or 1 (or 0, 1, 2.. if you might ever have 'unset') 
string[] heshe = { "he", "she" }; 
string[] hisher = { "his", "her" }; 
string[] himher = { "him", "her" }; 

が、これはそれがヒットし、ユーザーの選択に影響を与えなければならないところの標的領域である:

は、これは私がこれまで持っているものです。

void state_YourGender() 
    { 
     mytext.text = "Okay!" + 
      "\n" + 
      "\n" + 
      "What is your love interest gender?" + 
      "\n" + 
      "\n" + 
      "\n" + 
      "\n" + 
      "A) Male" + 
      "\n" + 
      "\n" + 
      "S) Female"; 

     timer -= Time.deltaTime; 

     if (Input.GetKeyDown(KeyCode.A)) 
     { 
      myState = States.Test; 
      gender = 0; 
      Gender playersGender = Gender.Male; 

     } 

     else if (Input.GetKeyDown(KeyCode.S)) 
     { 
      myState = States.Test; 

     } 

    } 

    void state_Test() 
    { 



     string phrase=" _heshe_was really happy"; 
     string newPhrase = phrase.Replace("_HESHE_", heshe[gender]); 

     timer -= Time.deltaTime; 

     if (timer <= 0 && Input.GetKeyDown(KeyCode.Space)) 
     { 
      timer = timerVal; 
      myState = States.YourGender; 

     } 
    } 

だから私は実験しようとしていると私が、文字列自体は全く戻らないために戻るには、文字列を呼び出すための方法を見つけるされています。また、mytextboxとダイアログボックスが表示される小さなボックスの領域を使用して、うまくいきましたので問題はありません。だからアドバイスやヒント?

答えて

0

エナムを使用してジェンダーのような排他的な値を格納することは良いアイデアですが、コードには良いアイデアではないいくつかの設計上の決定があります。まず、1人のプレーヤーのジェンダーの役割を保存するために、すでに4つのグローバル変数があります。それはすでにあまりにも多く、追加するすべてのプレイヤーやNPCで悪化します。代わりに、人を格納するためのクラスを作成してください:

public class Person 
{ 
    public string Name { get; private set; } 
    public Gender Gender { get; private set; } 
    public Gender LoveInterestGender { get; private set; } 
    public Person(string name, Gender gender, Gender loveInterestGender) 
    { 
     if (string.IsNullOrWhiteSpace(name)) throw new ArgumentNullException(nameof(name)); 

     Name = name; 
     Gender = gender; 
     LoveInterestGender = loveInterestGender; 
    } 
} 

初心者は、新しいクラスを作成することを奇妙に思います。しないでください。それがコードを単純化する主な方法です。今、あなたは、コードまたはUIを通して、あなたのプレーヤーを作成することができます。

var player = new Person(name: "Hiro Protagonist", gender: Gender.Male, loveInterestGender: Gender.Female); 

これは、文字列置換を使用してダイアログをカスタマイズしようとするも、悪い考えです。多くの場合、すべての "彼"を "彼女"などに置き換えるだけでなく、実際のダイアログを変更したいことがあります。ダイアログのルールを指定する必要があります。たとえば、話し手とリスナーの性別によって、ダイアログごとに異なるルールを指定できます。あなたはどうやってそれをしますか?もちろん、別のクラスで。けれども、私はしませんが理由のために、この特定のケースでは、読み取り専用の構造体には良いだろう:

public struct DialogSpecifier : IEquatable<DialogSpecifier> 
{ 
    public readonly Gender SpeakerGender; 
    public readonly Gender ListenerGender; 

    public DialogSpecifier(Gender speakerGender, Gender listenerGender) 
    { 
     SpeakerGender = speakerGender; 
     ListenerGender = listenerGender; 
    } 

    public bool Equals(DialogSpecifier other) 
    { 
     return SpeakerGender==other.SpeakerGender 
      && ListenerGender==other.ListenerGender; 
    } 
} 

わかりましたが、今私たちは、ダイアログの人々、そしてルールを持っています。これらのルールを使って、人々が互いに話すようにするにはどうすればよいですか?それぞれの性別ごとに各ルールごとに一人一人のコードを書くことができます。うわー、それはたくさんのコードです!コードをもう一度単純化するにはどうすればいいですか?そうそう、クラスを作成します。

public class Dialogue 
{ 
    Dictionary<DialogSpecifier, string> specifiedDialog = new Dictionary<DialogSpecifier, string>(); 

    public Dialogue(string noneToNone) 
    { 
     specifiedDialog.Add(new DialogSpecifier(Gender.None, Gender.None), noneToNone); 
    } 

    public Dialogue Add(DialogSpecifier specifier, string dialogue) 
    { 
     specifiedDialog.Add(specifier, dialogue); 
     return this; 
    } 

    public string OpeningGambit(Person speaker, Person listener) 
    { 
     string gambit; 
     if (specifiedDialog.TryGetValue(new DialogSpecifier(speakerGender: speaker.Gender, listenerGender: listener.Gender), 
       out gambit)) 
      return gambit; 

     return specifiedDialog[new DialogSpecifier(Gender.None, Gender.None)]; 
    } 
} 

わかりましたので、今のは何人かの人々との対話を作成してみましょう:

var introduction = new Dialogue("Hello") 
    .Add(new DialogSpecifier(Gender.Male, Gender.Male), "Wassup?"); 
var npc = new Person(name: "Juanita Marquez", gender: Gender.Female, loveInterestGender: Gender.Male); 

var gambit = introduction.OpeningGambit(player, npc); 

シンプルな、右?これは、クラスを作成し、すべての可能な順列のコードを記述しようとしなかったからです。これは容易に拡張可能です。さまざまな状況に応じてガンビットを追加したり、specifiedDialogDictionary<DialogSpecifier, List<string>>に変更することで、各指定子に1つのガンビットの代わりにガンビットのリストを持たせることができます。 DialogSpecifierにルールを追加することができます。たとえば、リスナーが話し手のLoveInterestGenderである場合は、動作が異なります。それを行うには、1つのクラスを変更するだけです。何かを追加するたびにすべてのコードを書き直す必要はありません。

関連する問題