高校の物理教材をUnityで作りたい!
というときにはやはり
- グラフを運動と同時に表示したい
- 位置、速度、加速度などの値を表示したい
と思います。
グラフを表示させる方法については以下の記事にまとめました。
今回は、速度を運動と同時に表示する方法について、勉強したことをまとめます。
uGUIを使ってテキストを表示させる
まず、運動させる物体として、3D Object→Sphereを作成しておきます。
次に、今回の本題であるテキストを表示するために、
Hierarchy → UI → Text を作成します。
この状態で再生すると、もうすでに「New Text」の文字が!!いいぞ。
このテキストをスクリプトから操作するために、Hierarchyから空のオブジェクトを作成し、「VelocityManeger」とリネームしておきます。
Project内のAssetを右クリックし、Create → C#Script を作成。VelocityManagerと名付けました。先程作った空のオブジェクトにアタッチしておきます。
コードです。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; //追加
public class VelocityManager : MonoBehaviour
{
public GameObject textObject ;
void Start()
{
}
void Update()
{ //Textオブジェクトからコンポーネントを取得する
Text textObject_text = textObject.GetComponent<Text>();
//表示する内容を指定する
textObject_text.text = "こんにちは";
}
}
using UnityEngine.UI; を入力するのを忘れないように注意してください!
単純に、”こんにちは”を表示するコードです。
編集画面には変化はありませんが、再生すると無事表示されました!
再生時に見やすくしてみた
これは後から好きなように変更可能なので、とばしてもらっても大丈夫です。
テキストが見づらいので、サイズを変えてみようと思って、
FontSizeを変更しようと思ったら、30くらいを超えたあたりから文字が消えてしまう…
調べてみたら、ここのサイトに解決方法がのっていました。
Paragraph内の「Horizontal Overflow」と「Vertical Overflow」を「Overflow」に変更することで、サイズを自由に変更できるようになりました。
適当にサイズ、色、フォント、表示位置などを変更してみました。
また、MainCameraオブジェクトのCameraコンポーネントにあるClear Flagsを「Skybox」から「Solid Color」に変更し、色を紺色っぽくしました。
これで再生してみると、こんな感じです。
見やすくなったかどうかは人によりますね笑
Rigidbodyを使って物体を加速させる
SphereのコンポーネントにRigidbodyを追加し、Use Gravityのチェックを外しておきます。
Sphereオブジェクトの「Add Component」から「New Script」を追加。VelocityChangeにリネームしました。以下のコードを入力します。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class VelocityChange : MonoBehaviour
{
Rigidbody rb;
void Awake()
{
rb = this.GetComponent<Rigidbody>();
}
void FixedUpdate()
{
Vector3 f = new Vector3(1f, 0f,0f ); // x軸方向に力を定義
rb.AddForce(f);//力を加える
}
}
速度変化を表示させる
VelocityManagerスクリプトから、物体の速度情報を取得して、それを表示していきます。以下のようにコードを変更しました。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; //追加
public class VelocityManager : MonoBehaviour
{
public GameObject textObject ;
public GameObject sphere;
Rigidbody rb ;
void Awake()
{
rb = sphere.GetComponent<Rigidbody>() ;
}
void Update()
{
//Textオブジェクトからコンポーネントを取得する
Text textObject_text = textObject.GetComponent<Text>();
//sphereオブジェクトから速さ(速度の大きさ)を取得する
float vel = rb.velocity.magnitude;
//float型を文字列に変更する
string vel_String = vel.ToString();
//表示する内容を指定する
textObject_text.text = "v="+vel_String;
}
}
VelocityManagerのスクリプトコンポーネント内にSphereオブジェクトをアタッチします。
このように表示されました。
勉強させてもらってます!楽しい!
コメント