##uGUIで禁則処理する
禁則処理とは?
禁則処理 - Wikipedia
日本語を表示する上で、ほぼ必須である禁則処理ですが、uGUIのTextでは、禁則処理が行われません。
よって、自前で実装…………しません。
こちらを使います!
tsubaki/HyphenationJpn_uGUI: uGUIでの禁則処理
(オリジナルはこちらinoook/HyphenationJpn_uGUI: uGUIでの禁則処理)
uGUIのTextのついてるオブジェクトに、このスクリプトをアタッチ。
分かりづらいかもしれませんが、しっかり禁則処理が行われています。
以下のようなプログラムで、スクリプト上から文字を変更することができます。
using UnityEngine;
public class Sample : MonoBehaviour {
void Start()
{
var m_Text = GetComponent<HyphenationJpn>();
m_Text.GetText("好きな文字");
}
}
で、本題。
なぜGet…?
uGUIのTextでは、文字を変更するときは
using UnityEngine;
using UnityEngine.UI;
public class Sample : MonoBehaviour {
void Start()
{
var m_Text = GetComponent<Text>();
m_Text.text = "好きな文字";
}
}
のようにtextプロパティを用います。
が、こちらではGetText(string s)
というメソッドを用います。
なぜ、Get…?
ちなみにオリジナルでは
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)
なぜでしょう…(答えを持っている人は教えてください…)
プロパティがいいなあと思って、以下のような実装に変更。
[TextArea(3, 10), SerializeField]
private string m_Text;
public string text
{
get { return m_Text; }
set {
m_Text = value;
UpdateText(m_Text);
}
}
これでuGUIと同じ!
using UnityEngine;
public class Sample : MonoBehaviour {
void Start()
{
var m_Text = GetComponent<HyphenationJpnFixed>();
m_Text.text = "変更したい文字";
}
}
で、次の話
プロパティでどこまで処理する…?
これで便利!と思ったのですが、先輩に
「(プロパティで処理するには)やりすぎ…」
と言われてしまいました…
上では見せていませんが、実際にSetする過程で、以下のような処理が行われています。
[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ではどのくらいの処理を行うべきか…?に続く…
(ちなみに、プロパティに書き換えたものは、結局使いませんでした… )