9
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

uGUIで禁則処理する

Last updated at Posted at 2017-02-04

##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のテキスト表示機能について解説してみる - テラシュールブログ

9
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?