本日、山仲間であり、プログラマーでもある友人が訪ねてきました。
彼の目的は私に仕事で使うオーディオインターフェースについて教えて欲しいというものです。
私はDTMもやっているので、若干その辺りの知識があります。
で、オーディオインターフェースの説明なんていっても大したことはないので、2時間程度で終わりました。
勘のいい方は気が付いたでしょうか?
そう、彼の特技はプログラミングなのです!
眠っていたUnityを起動し、教えを乞うことに。
いやあ、さすがに仕事でバリバリやっている人間は凄いです。
C#は使ったことがなく、Unityも初見でしたが、ガリガリとコードを打ち込み、少し動くように。
主にフラグ周りの基礎を実装してもらいました。
彼の帰宅後、私が2時間ほどかけて修正し、遂に!

まだ調整が微妙なので動画にはしていませんが、動いております!
水をやって回転、歩いて回転、また水をやって回転……と木の間を往復するだけですが、コードは100行近くになりましたw
多分、物凄く効率の悪いコードになっている気がします。
長いけど、一応貼ってみますね。
using UnityEngine;
using System.Collections;
public class Town_Girl : MonoBehaviour {
public const int state_water_drop = 0x0000;
public const int state_rotate = 0x0001;
public const int state_rotate2 = 0x0002;
public const int state_rotate3 = 0x0003;
public const int state_rotate4 = 0x0004;
public const int state_translate = 0x0005;
public const int state_translate2 = 0x0006;
public static int[] town_girl_state = new int[2];
// Use this for initialization
void Start () {
town_girl_state[0] = state_rotate;
town_girl_state[1] = 0;
}
// Update is called once per frame
void Update () {
if (town_girl_state[0] == state_rotate) {
if (town_girl_state[1] == 0){
animation.Play("Girl_Water_drop");
town_girl_state[1] = 1;
}
if (!animation.IsPlaying("Girl_Water_drop")){
town_girl_state[1]++;
if(town_girl_state[1] <= 60){
transform.Rotate(0,-1.5f,0);
if(town_girl_state[1] == 60){
town_girl_state[0] = state_translate;
town_girl_state[1] = 0;
}
}
}
}
if (town_girl_state[0] == state_translate) {
town_girl_state[1]++;
if(town_girl_state[1] <= 310){
animation.Play("Girl_Walk");
transform.Translate(0, 0, 0.5f);
if(town_girl_state[1] == 310){
town_girl_state[0] = state_rotate2;
town_girl_state[1] = 0;
}
}
}
if (town_girl_state[0] == state_rotate2) {
town_girl_state[1]++;
if(town_girl_state[1] <= 60){
transform.Rotate(0,1.5f,0);
if(town_girl_state[1] == 60){
town_girl_state[0] = state_rotate3;
town_girl_state[1] = 0;
}
}
}
if (town_girl_state[0] == state_rotate3) {
if (town_girl_state[1] == 0)
{
animation.Play("Girl_Water_drop");
town_girl_state[1] = 1;
}
if (!animation.IsPlaying("Girl_Water_drop")){
town_girl_state[1]++;
if(town_girl_state[1] <= 60){
transform.Rotate(0,1.5f,0);
if(town_girl_state[1] == 60){
town_girl_state[0] = state_translate2;
town_girl_state[1] = 0;
}
}
}
}
if (town_girl_state[0] == state_translate2) {
town_girl_state[1]++;
if(town_girl_state[1] <= 310){
animation.Play("Girl_Walk");
transform.Translate(0, 0, 0.5f);
if(town_girl_state[1] == 310){
town_girl_state[0] = state_rotate4;
town_girl_state[1] = 0;
}
}
}
if (town_girl_state[0] == state_rotate4) {
town_girl_state[1]++;
if(town_girl_state[1] <= 60){
transform.Rotate(0,-1.5f,0);
if(town_girl_state[1] == 60){
town_girl_state[0] = state_rotate;
town_girl_state[1] = 0;
}
}
}
}
}
transform.Rotateがある箇所で回転、transform.Translateで前進を行っています。
ポイントはif (!animation.IsPlaying("Girl_Water_drop")) ですね。
これはジョウロで水をやるアニメーションを終わったら、その中の処理を行うというもので、これがないとアニメーションの途中で回転とか始まってしまいます。
とりあえず、これが理解出来ればRPGのキャラを決まった動作で動かすというのは可能になるはず。
Unityについて書かれているブログに大変助けられているので、同志の方の参考になれば幸いです。
相当にマニアックな内容なので、Blender目当ての方はスルー推奨です。
知恵熱が出るかと。実際、私も頭痛がしました。
戦闘シーンとかの実装は私の技量では不可能な気がしていますが、また何か進展がありましたら、ご紹介しますね。
あと、今回のスクリプトなら私も大体理解出来たので、分からない箇所がありましたら質問して下さい。
こうすればもっとスムーズになる等の意見も、大歓迎します!
- 2014/01/12(日) 21:23:06|
- Unity
-
| トラックバック:0
-
| コメント:0