Edited at

uGUIで禁則処理する

More than 1 year has passed since last update.


uGUIで禁則処理する

禁則処理とは?

禁則処理 - Wikipedia

日本語を表示する上で、ほぼ必須である禁則処理ですが、uGUIのTextでは、禁則処理が行われません。

よって、自前で実装…………しません。

こちらを使います!

tsubaki/HyphenationJpn_uGUI: uGUIでの禁則処理

(オリジナルはこちらinoook/HyphenationJpn_uGUI: uGUIでの禁則処理)

uGUIのTextのついてるオブジェクトに、このスクリプトをアタッチ。

このようになっていたものが

uGUIText

このように!

HyphenationJpn

分かりづらいかもしれませんが、しっかり禁則処理が行われています。

以下のようなプログラムで、スクリプト上から文字を変更することができます。


Sample.cs

using UnityEngine;

public class Sample : MonoBehaviour {
void Start()
{
var m_Text = GetComponent<HyphenationJpn>();
m_Text.GetText("好きな文字");
}
}


で、本題。


なぜGet…?

uGUIのTextでは、文字を変更するときは


Sample.cs

using UnityEngine;

using UnityEngine.UI;

public class Sample : MonoBehaviour {
void Start()
{
var m_Text = GetComponent<Text>();
m_Text.text = "好きな文字";
}
}


のようにtextプロパティを用います。

が、こちらではGetText(string s)

というメソッドを用います。

なぜ、Get…?

ちなみにオリジナルでは


HyphenationJpn.cs(オリジナル)の一部

void UpdateText(string str)

{
// update Text
Text textComp = this.gameObject.GetComponent<Text>();
textComp.text = SetText(textComp, str);
}

public void SetText(string str)
{
text = str;
UpdateText(text);
}


SetText(string s)

なぜでしょう…(答えを持っている人は教えてください…)

プロパティがいいなあと思って、以下のような実装に変更。


HyphenationJpnFixed.cs(改良後)の一部

[TextArea(3, 10), SerializeField]

private string m_Text;
public string text
{
get { return m_Text; }
set {
m_Text = value;
UpdateText(m_Text);
}
}

これでuGUIと同じ!


Sample.cs

using UnityEngine;

public class Sample : MonoBehaviour {
void Start()
{
var m_Text = GetComponent<HyphenationJpnFixed>();
m_Text.text = "変更したい文字";
}
}


で、次の話


プロパティでどこまで処理する…?

これで便利!と思ったのですが、先輩に

「(プロパティで処理するには)やりすぎ…」

と言われてしまいました…

上では見せていませんが、実際にSetする過程で、以下のような処理が行われています。


HyphenationJpnFixed.cs

[TextArea(3, 10), SerializeField]

private string m_Text;
public string text
{
get{ return m_Text; }
set{
m_Text = value;
UpdateText(m_Text);
}
}

private Text _Text{
get{
if( _text == null )
_text = GetComponent<Text>();
return _text;
}
}
private Text _text;

void UpdateText(string str)
{
// update Text
_Text.text = GetFormatedText(_Text, str);
}

string GetFormatedText(Text textComp, string msg)
{
// かなり大きめの処理なので省略…
}


プロパティはGetter, Setterメソッドを定義できますよね。

なんでもできるのですが、Getterは値の取得、Setterは値の代入をするところ。軽い気持ちで何度もGet, Setできねばならないでしょう。

では、Getter, Setterではどのくらいの処理まで行うべきなのでしょうか…?

次回、プロパティのGetter, Setterではどのくらいの処理を行うべきか…?に続く…

(ちなみに、プロパティに書き換えたものは、結局使いませんでした… )


2/9 補足

uGUIで禁則処理する の続き - Qiita


参考URL

UnityのuGUIのテキスト表示機能について解説してみる - テラシュールブログ