複数のパラメータを作成して、会話するたびに増加させ、UIで表示させたい

146 views
Skip to first unread message

つう

unread,
Oct 10, 2022, 4:56:54 AM10/10/22
to 宴ユーザーグループ

宴のバージョン:3.11.7
・unityのバージョン:Unity2021.3.18
・OSバージョン:Win11
・Unityの習熟度:初心者(始めて1年)

いつもお世話になっております。

〈やりたいこと〉
好感度の他に複数のパラメータを作成して、会話するたびに増加させ、UIで表示させたい。

〈やったこと〉
kokando(好感度)パラメータを作り、会話するとkokandoが1ずつ上がるように設定し、会話するごとにUI表示で加算されていくのを確認。

二つ目のパラメータchiryoku(知力)を作り、添付のエクセル画像の通りParamシートParamKokandoシートで会話によって1ずつ上がるよう設定し、下記のスクリプトを書きました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Utage;
public class ParameterManager : MonoBehaviour
{
public AdvEngine engine;

// UI Text指定用
public Text TextKokando;
public Text TextChiryoku;

void Update()
{
 // 宴読み込み
 int point = engine.Param.GetParameterInt("kokando");
 // テキストにパラメータの値を反映させる
 TextKokando.text = point + "";

 // 宴読み込み
 int point2 = engine.Param.GetParameterInt("chiryoku");
 // テキストにパラメータの値を反映させる
 TextChiryoku.text = point2 + "";

 }
}

〈できていないこと〉
※int point2 = engine.Param.GetParameterInt("chiryoku"); について、pointは一度しか使えないとエラーが出たのでpoint2としましたが、UIで数字が上がるのを確認できませんでした(画像)。複数のパラメータをUnityで処理できるようなスクリプトの書き方がわかっていません。

インスペクターへのアタッチもしています(画像)。

お手数ですが、教えていただけますでしょうか。何卒お願いいたします。 
UnityEditer.jpg
ParamTestSheet.jpg
UnityUI.jpg
ParamSheet.jpg

つう

unread,
Oct 10, 2022, 5:03:39 AM10/10/22
to 宴ユーザーグループ
すみません、エラーが出ていたので記載いたします。今回の二件kokando(好感度)とchiryoku(知力)のパラメータが設定できていないということでしょうか。
宜しくお願いいたします。

kokando is not found in parameter
UnityEngine.Debug:LogErrorFormat (string,object[])
Utage.AdvParamManager:SafeFindParamData (string) (at Assets/Utage/Scripts/ADV/DataManager/SettingData/Param/AdvParamManager.cs:215)
Utage.AdvParamManager:GetParameterInt (string) (at Assets/Utage/Scripts/ADV/DataManager/SettingData/Param/AdvParamManager.cs:152)
ParameterManager:Update () (at Assets/Scripts/ParameterManager.cs:25)

chiryoku is not found in parameter
UnityEngine.Debug:LogErrorFormat (string,object[])
Utage.AdvParamManager:SafeFindParamData (string) (at Assets/Utage/Scripts/ADV/DataManager/SettingData/Param/AdvParamManager.cs:215)
Utage.AdvParamManager:GetParameterInt (string) (at Assets/Utage/Scripts/ADV/DataManager/SettingData/Param/AdvParamManager.cs:152)
ParameterManager:Update () (at Assets/Scripts/ParameterManager.cs:31)
2022年10月10日月曜日 17:56:54 UTC+9 つう:

マッドネスラボ

unread,
Oct 10, 2022, 5:22:04 AM10/10/22
to 宴ユーザーグループ
Updateなどでパラメーターを取得しようとすると、宴の初期化前にパラメーターを取得しようとして、エラーになってしまうことがあります。

こちらのドキュメントを参考に、
    if (!engine.Param.IsInit) return; などどとして、
パラメーターを取得する前に、初期化チェックを挟むようにしてください。


2022年10月10日月曜日 18:03:39 UTC+9 tsubo...@gmail.com:

つう

unread,
Oct 11, 2022, 4:51:15 AM10/11/22
to 宴ユーザーグループ
回答いただきありがとうございました。
下記の通り  if (!engine.Param.IsInit) return; を挟んだところ、エラーは消えてました。

void Update()
{
 if (!engine.Param.IsInit) return;

 // 宴読み込み
 int point = engine.Param.GetParameterInt("kokando");
 // テキストにパラメータの値を反映させる
 TextKokando.text = point + "";

 // 宴読み込み
 int point2 = engine.Param.GetParameterInt("chiryoku");
 // テキストにパラメータの値を反映させる
 TextChiryoku.text = point2 + "";

また、会話で上げたパラメータのUI表示の件ですが、エクセルシートのほうで一列目Paramの入力を忘れていたためでした。入力したら表示されるようになり、無事解決しました。

2022年10月10日月曜日 18:22:04 UTC+9 マッドネスラボ:

つう

unread,
Oct 12, 2022, 5:24:54 AM10/12/22
to 宴ユーザーグループ
宴のバージョン:3.11.7
unityのバージョン:Unity2021.3.18
・OSバージョン:Win11
・Unityの習熟度:初心者(始めて1年)

いつもお世話になっております。表題の件に関連して、追加の質問をさせてください。

〈やりたいこと、わからないこと〉
今までUpdate関数で呼び出してパラメータをUIに表示していたのを、
SendMessageのコマンドによって、パラメータの好感度(kokando)を取得してUIに表示させることができました。
しかし、SendMessageコマンド以降の会話が表示されず、キャラクターが表示されたままフリーズしてしまうようになり、
どのように直すのかわからない状態です。(画像あり)

〈やったこと〉
kokando(好感度)パラメータを作り、会話するとkokandoが1ずつ上がるように設定しました。
SendMessageでコマンドを使って、kokandoのパラメータをUIのテキストに反映させるためのスクリプトを作成(御社の下記URL参考)、エクセルにコマンド入力しました(画像添付)



※以下スクリプト該当部分のみ抜粋

using UnityEngine;
using Utage;
using System.Collections;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

[AddComponentMenu("Utage/ADV/Examples/UtageRecieveMessageSample")]

public class UtageRecieveMessageSample : MonoBehaviour

{
 public Text TextKokando;

 void OnDoCommand(AdvCommandSendMessage command)
 {
  switch (command.Name)
  {
   case "SetKokando":
     SetKokando(command);
     break;
  }

 void OnWait(AdvCommandSendMessage command)
 {
  switch (command.Name)
 {
  case "SetKokando":
   command.IsWait = true;
   break;
  }
 }

void SetKokando(AdvCommandSendMessage command)
{
 if (!engine.Param.IsInit) return;
 Debug.Log("SetKokando");
 // 宴読み込み
 int point = engine.Param.GetParameterInt("kokando");
 TextKokando.text = point + "";
 }


エラーなども出ていないのですが、エクセルの書き方などが間違っているのでしょうか。
お手数ですが教えてください。宜しくお願いいたします。
2022年10月11日火曜日 17:51:15 UTC+9 つう:
エクセルSendMessage.jpg
UnitySendMessage.jpg

マッドネスラボ

unread,
Oct 12, 2022, 6:49:18 AM10/12/22
to 宴ユーザーグループ
>おそらくこの部分が原因です。

 void OnWait(AdvCommandSendMessage command)
 {
  switch (command.Name)
 {
  case "SetKokando":
   command.IsWait = true;
   break;
  }
 }

OnWaitはコマンドの待機判定の際に呼ばれ、
   command.IsWait = true;
としていると、そのコマンドが待機状態になります。

OnWaitはコマンド待機中は毎フレーム呼ばれます。
IsWaitにtrueが設定されている限りは、ずっとコマンドは待機状態になるのでそこから進まず、結果的にフリーズのように見えてしまうと思います。

待機する必要がないなら、
   command.IsWait = false;
としてください。
なんらかタイミングで待機を解除したいなり、それを判別できるにプログラムを書いてください。

2022年10月12日水曜日 18:24:54 UTC+9 tsubo...@gmail.com:

つう

unread,
Oct 16, 2022, 2:32:26 AM10/16/22
to 宴ユーザーグループ
回答ありがとうございました。
IsWaitにtrueが設定されているとずっとコマンドは待機状態になるのですね。falseに変えたらフリーズ状態と思っていた会話が進み解消しました。
お忙しい中いつもありがとうございます。

2022年10月12日水曜日 19:49:18 UTC+9 マッドネスラボ:

つう

unread,
Nov 8, 2022, 2:24:28 AM11/8/22
to 宴ユーザーグループ
宴のバージョン:3.11.7
unityのバージョン:Unity2021.3.18
・OSバージョン:Win11
・Unityの習熟度:初心者(2年目)

いつもお世話になっております。
前回の質問と関連する部分なので、続きから質問させていただきます。

現在メインのシーンを置き、他のシーンをロードしたりアンロードする加算シーンの方法で開発を進めています。

〈やりたいこと〉
テストシーンで表示させた好感度(Kokando)パラメータの数値をUnityのプログラムから加算させて、メインシーンに戻った時UIに表示させたい。

〈試したこと〉
テストシーンのUIに、条件によって変化するKokandoCountの数値を表示させました。
そのKokandoCountの数値をKokandoパラメータに反映させるため、御社の上記ページを参考にUnityプログラムからパラメータを操作すクリプトを書きましたが、メインシーンのUIに反映させることができていません。
「Kokando is not parameter name UnityEngine.Debug:LogError (object) 」とエラーが出ていて、これはパラメータの取得ができていないのでしょうか?


以下スクリプトです。(該当部分)

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.Linq;
using System;
using Utage;
public class TypingManager : MonoBehaviour
{
int KokandoCount;

[SerializeField] Text KokandoUpText;

private void Update()
{
// 入力された時に正解率が90より上だったら2、それ以下は1にしてKokanddoUpTextのUIに反映させる
if (Input.anyKeyDown)
{
 if (romCorrectRate > 90)
 {
  KokandoCount = 2;
 }
 else
 {
   KokandoCount = 1;
 }
 KokandoUpText.text = $"{KokandoCount}";
 Parameter();
}

public void Parameter()
{
 //パラメーターの取得
 var obj = UtageRecieveMessageSample.instance.engine.Param.GetParameter("Kokando");
 Debug.Log("KokandoTest");
 // 宴読み込み
 int point = UtageRecieveMessageSample.instance.engine.Param.GetParameterInt("Kokando");
 //パラメーターの設定
 UtageRecieveMessageSample.instance.engine.Param.SetParameter("Kokando", KokandoCount);
 //型指定済みの設定方法
 UtageRecieveMessageSample.instance.engine.Param.SetParameterInt("Kokando", KokandoCount);
 UtageRecieveMessageSample.instance.TextKokando.text = point + "";
}
}


なお、メインシーンのパラメータUI表示は下記のスクリプトを使っています。

〈UtageRecieveMessageSampleのスクリプト〉

public static UtageRecieveMessageSample instance;
public void Awake()
{
 if (instance == null)
 {
  instance = this;

 }
}

void SetKokando(AdvCommandSendMessage command)
{
 if (!engine.Param.IsInit) return;
 Debug.Log("SetKokando");
 // 宴読み込み
 int point = engine.Param.GetParameterInt("kokando");
 TextKokando.text = point + "";
}

Unityの基礎の問題でしたらすみません。
関連する画像を添付します。①メインシーンのパラメータUI画面 ②テストシーンの結果画面
お忙しいところ申し訳ありませんが、教えていただけますでしょうか。何卒宜しくお願いいたします。

MainSceneParameterUI.pngRezult.png

  
2022年10月16日日曜日 15:32:26 UTC+9 つう:

マッドネスラボ

unread,
Nov 8, 2022, 3:40:34 AM11/8/22
to 宴ユーザーグループ
以前お伝えしたように、宴の初期化前にパラメーターにアクセスするとそのようなエラーがでます。
Update中にParameter()が呼ばれているので、おそらくそこが原因です。

public void Parameter()
{
 if (! UtageRecieveMessageSample.instance.engine.IsInit) return;

 //パラメーターの取得
 var obj = UtageRecieveMessageSample.instance.engine.Param.GetParameter("Kokando");
・・・以下略


という感じで、GetParameterを呼ぶ前に初期化のチェックをしてください。







2022年11月8日火曜日 16:24:28 UTC+9 tsubo...@gmail.com:

つう

unread,
Nov 12, 2022, 8:24:57 AM11/12/22
to 宴ユーザーグループ
回答いただきありがとうございました。
パラメータ名を間違ってkokandoのところをKokandoにしていたためでした。
無事解決いたしました。

2022年11月8日火曜日 17:40:34 UTC+9 マッドネスラボ:

つう

unread,
Nov 15, 2022, 7:49:17 AM11/15/22
to 宴ユーザーグループ
宴のバージョン:3.11.7
unityのバージョン:Unity2021.3.18
・OSバージョン:Win11
・Unityの習熟度:初心者(2年目)

いつもお世話になっております。
前回の質問と関連する部分なので、続きから質問させていただきます

〈やりたいこと〉
テストシーンで複数回表示させた好感度(Kokando)パラメータの数値を、Unityのプログラムからテストシーン表示の回数分加算させて、メインシーンに戻った時UIに表示させたい。

〈試したこと〉
メインシーンに戻った時にUIに表示させることはできたのですが、画像の通り、数を加算させることができておらず、テストシーンで表示された好感度(kokando)が毎回新しく更新されてしまいます。
また、メインシーンで上げた好感度については、加算できているのですが、それもテストシーンを挟むと更新されてしまいます。
※添付の画像は、メインシーンのUIです。タイピング回数の欄がテストシーンに遷移した回数となっています。タイピング回数が上がっても、好感度の数値は上がっていません(テストシーンの好感度では1か2が表示されているのですが、メインシーンのUIに加算はされていませんでした。)


以下スクリプトです。(該当部分)
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.Linq;
using System;
using Utage;
public class TypingManager : MonoBehaviour

{
int kokandoCount;
[SerializeField] Text kokandoUpText;

private void Update()
{
// 入力された時に正解率が90より上だったら2、それ以下は1にしてKokanddoUpTextのUIに反映させる
if (Input.anyKeyDown)
{
if (romCorrectRate > 90)
{
kokandoCount = 2;
}
else
{
kokandoCount = 1;
}
kokandoUpText.text = $"{kokandoCount}";
Parameter();
}

public void Parameter()
{
if (!UtageRecieveMessageSample.instance.engine.Param.IsInit) return;
//パラメーターの取得
var obj = UtageRecieveMessageSample.instance.engine.Param.GetParameter("kokando");
Debug.Log("KokandoTest");
// 宴読み込み
int point = UtageRecieveMessageSample.instance.engine.Param.GetParameterInt("kokando");
//パラメーターの設定
UtageRecieveMessageSample.instance.engine.Param.SetParameter("kokando", kokandoCount);
//型指定済みの設定方法
UtageRecieveMessageSample.instance.engine.Param.SetParameterInt("kokando", KokandoCount);
UtageRecieveMessageSample.instance.TextKokando.text = point + "";
}
}


なお、メインシーンのパラメータUI表示は下記のスクリプトを使っています。

〈UtageRecieveMessageSampleのスクリプト〉

public static UtageRecieveMessageSample instance;

public void Awake()
{
if (instance == null)
{
instance = this;
}
}

void SetKokando(AdvCommandSendMessage command)
{
if (!engine.Param.IsInit) return;
Debug.Log("SetKokando");
// 宴読み込み
int point = engine.Param.GetParameterInt("kokando");
TextKokando.text = point + "";
}

画像を添付いたします。
お忙しいところお手数ですが、教えていただけますでしょうか。何卒宜しくお願いいたします。

2022年11月12日土曜日 22:24:57 UTC+9 つう:
messageImage_1668433249847.jpg
messageImage_1668433296726.jpg
messageImage_1668433275037.jpg
messageImage_1668433325065.jpg

マッドネスラボ

unread,
Nov 15, 2022, 10:48:21 AM11/15/22
to 宴ユーザーグループ
宴のオブジェクト(おそらくUtageRecieveMessageSample.instanceがあるほうのシーン)はどちらのシーンでしょうか?
もし、メインシーンではないほうに置いているなら、毎回リセットされてしまいます。
基本的には宴はメインシーンに置いておいた方が実装は楽です。

それをしないのであれば、次のいずれかの手段をとる必要があります。
・宴のあるシーンをアンロードしない
・DontDestoryなどを使って、消さないようにする
・セーブデータを使って毎度シーンを移動する前に、現在の値を書き込み。シーンを再ロード後にセーブデータを読み込みして復帰

宴に限った話ではないのですが、
Unityの複数シーンで、シーンをロード、アンロードしてに「さっきの画面に戻る」とか「さっきの状態に復帰させる」というのはできません。
一度アンロードしたシーンは、ロードしなおしたら最初からやり直しになります。

そのため
「シーンをアンロードせずに使いまわすか、DontDestoryを使って消さないようにする」か
「メインシーンで必要な情報を常に保持して、その情報でサブシーン側に再開できるようなを渡す」という形になります。

宴の場合は、メインシーンに常に置いて必要になったら再生するというやり方が一番楽です。


2022年11月15日火曜日 21:49:17 UTC+9 tsubo...@gmail.com:

マッドネスラボ

unread,
Nov 15, 2022, 11:05:11 AM11/15/22
to 宴ユーザーグループ
すみません。
>なお、メインシーンのパラメータUI表示は下記のスクリプトを使っています。
>UtageRecieveMessageSampleのスクリプト
と書いていますね。ということは、メインシーンに宴があるのかと思いますので、上記の点は関係ないと思います。

            UtageRecieveMessageSample.instance.engine.Param.SetParameterInt("kokando", KokandoCount);
となっていますが、これですと「kokandoCount」の値・・・つまり上昇値で好感度を上書きする形になるので、

            point += kokandoCount;
            UtageRecieveMessageSample.instance.engine.Param.SetParameterInt("kokando", point);
として、元の値と上昇値を加算してから、Setしてみてください。


また、GetParameterとGetParameterInt
SetParameterとSetParameterInt 両方使っていますが、
基本的にはGetParameterIntとSetParameterIntのみでよいと思います。


サンプルを書くとこんな感じでしょうか。
        public void Parameter()
        {
            var param = UtageRecieveMessageSample.instance.engine.Param;
            if (!param.IsInit) return;

            const string KokandoName = "kokando";
            int point = param.GetParameterInt(KokandoName);
            point += kokandoCount;
            param.SetParameterInt(KokandoName, point);
            UtageRecieveMessageSample.instance.TextKokando.text = point + "";
        }



2022年11月16日水曜日 0:48:21 UTC+9 マッドネスラボ:

つう

unread,
Nov 27, 2022, 8:48:38 AM11/27/22
to 宴ユーザーグループ
ご連絡が遅くなりすみません。回答いただきありがとうございます。

教えていただいたサンプルスクリプトを使用したところ、
画像の通りタイピング1回目は2増えるところが54、2回目も2増えるところが94、3回目も2増えるところが153…という具合に不規則にParam01.pngParam02.png増えます。

ご説明を参考に試行錯誤もしましたが、
分かりませんでした。

大変お手数ですが、メインシーンでの数の加算方法を教えていただけますでしょうか。
宜しくお願いいたします。



2022年11月16日水曜日 1:05:11 UTC+9 マッドネスラボ:

マッドネスラボ

unread,
Nov 27, 2022, 10:08:46 AM11/27/22
to 宴ユーザーグループ
加算方法は上記のサンプルの通り、Getした値を加算して、Setするだけです。

          int point = param.GetParameterInt(KokandoName);
            point += kokandoCount;
            param.SetParameterInt(KokandoName, point);

想定通りにならないのだとしたら、意図しないところで重複して何度も呼ばれているとか、なんらかの単純なプログラムのミスがあるだけだと思います。
Debug.Logなどで値や呼び出しタイミングをチェックしみてください。



2022年11月27日日曜日 22:48:38 UTC+9 tsubo...@gmail.com:

つう

unread,
Nov 27, 2022, 6:00:49 PM11/27/22
to 宴ユーザーグループ
回答いただきありがとうございました。教えていただき、正しい数値の加算をすることができました。
おっしゃっていた通り、キーを押すたびにUpdate関数でカウントしてしまっていたので、重複して何度も呼ばれていました。

いつも大変迅速な対応で助かります。ありがとうございます。


2022年11月28日月曜日 0:08:46 UTC+9 マッドネスラボ:
Reply all
Reply to author
Forward
0 new messages