はらけんログ

unity触ったりバイクに乗ったり

【Unity】TweenAnimationについて -その1 Tweenとは-

 

昨日、久々に東方紅魔郷をプレイしました。

やっぱりBGMが神かがってますね。

 

 

それはさておき

昨日は、ブログ書いてないので、unityでなんかつくるときに重要なTweenについて書こうと思う。

 

Tweenってなんぞね?っていう人には「とりあえずググれカス」と言いたいところだけど、ググってもツイッターのクライアントしかでてこないので、簡単に説明します。

 

 

Tweenって?

簡単に説明すると今回(僕の)場合、Tweenとはツイッターのクライアント」アニメーションさせるプログラム」の事をさします。

 

AssetStoreでTweenと検索すればわかるが、

iTween、Gokit、HOTween、LeanTween、、、

などなど、様々なTweenのAssetがStoreにゴロゴロ転がってる。(しかも無料)

こいつらめっちゃ便利なんです。

 

 

使い方

例えば、「だんだんオブジェクトを早くする」「だんだん大きくさせる」と、いったような「だんだん~する」みたいな実装をする際に用いる。

 

例、「だんだん透過させる」

※ポリゴンショックに注意

f:id:HarakeN:20161118195352g:plain

 

 

「だんだん~させる」には、素でコードを書くと、えらくめんどくさい。

 

それがこのTweenAssetを使えば2、3行で実装できてしまう。

 

 

使い方はAssetによって変わるので注意が必要。

ちなみに僕が使ったことあるAssetはGokitとLeanTween。

 

今回はLeanTweenを使って実装した。

 

 

今回はこの辺で

そのうち細かく噛み砕いて書いてく。

 

 

 

AdamくんがPPAPを踊ってくれました。

 

先日、AdamのAssetが公開されたので、ダウンロードしてみました。

 

で、Adam君に例のアニメーションをつけてみました。

素材はくまじゃなくてぐるくん (@gurukun237) | Twitterさんのtoggeterから

togetter.com

 


Adam君がPPAP踊ってた

 

(これライセンス大丈夫かなぁ?)

【Unity】StreamingAssetsに格納したファイルから文字列とかを取得する

 

はい。

拙者、もう少しわかりやすく内容を書きたいなと思っているでござる。

 

っていうのも今回つまずいたところは公式リファレンスの書き方が間違っていて、動作しなかったから。

 

ちゃんと動かせるソースを教えろよな(超上から目線)

 

ってか他のブログとかでも var とか使ってる奴のコードわかりにくいでしょ?

そんなかんじのわかりにくいコードを書かないように頑張りたい。

 

んで、今日はstreamingAssetsに入れたメモ帳などから文字列を取得する方法です。

リファレンスだと

public class ExampleClass : MonoBehaviour {
    public string filePath = System.IO.Path.Combine(Application.streamingAssetsPath, "MyFile");
    public string result = "";
    IEnumerator Example() {
        if (filePath.Contains("://")) {
            WWW www = new WWW(filePath);
            yield return www;
            result = www.text;
        } else
            result = System.IO.File.ReadAllText(filePath);
    }
}

 ってなってる。(コピペです)

 

で、実行すると

get_streamingAssetsPath is not allowed to be called during serialization, call it from Awake or Start instead.・・・

みたいなエラーが返ってきて動かない。(動くには動くけど取得は出来ない)

 

で、これのいけないところは

public string filePath = System.IO.Path.Combine(Application.streamingAssetsPath, "MyFile");

 ってところ。

 

 これを

public string filePath ;

void Start()

{

filePath = System.IO.Path.Combine(Application.streamingAssetsPath, "MyFile");

}

 ってな感じにしてやると動く。

 

つまり、「宣言ついでに定義するな。StartとかAwakeでやれ。」っていうエラーなんです。(Google先生にエラー翻訳してもらえば一発)

 

 

それでも動かねぇっていう人はファイルネームを確認してください。(赤文字の部分)

System.IO.Path.Combine(Application.streamingAssetsPath, "MyFile");

 

これ、実は拡張子も入れないとダメっぽい

 

だから、取得するファイルがテキストファイルだった場合、本当は

System.IO.Path.Combine(Application.streamingAssetsPath, "MyFile.txt");

 

 っていれなきゃならん。

 

こんなんで時間食わせないでよUnityさん。

最近お仕事が捗らなかった理由

 

最近、仕事が本当に進まない。

 

っていうのも、コーディングするときって本当にいろいろやり方がある上で、いかに可読性が良くして、かつ処理を軽く実装するかを考えると思うんだけど、パラメータを変える部分が多いと「本当にこんなんでいいのか?」って思ってしまうんよ。

 

で、今回はLINEのようなチャットのUIを実装する段階でつまずいた。

パラメータを渡す部分はuGUIのImageとpositionXとテキストの内容とそれらのサイズ。さらにベースとなるprefabからインスタンス化してアニメーションさせる。ってもの。

 

何を言ってるかわからないと思うがry

で、どうしたもんかなぁってブログで愚痴ろうと思ったんだけど、(すでに愚痴ってる)書いてる途中で

「パラメータの違うpurefabもう1つ作ればいいじゃん」

っていう超天才的な発想が脳裏をよぎった。

 

もうね、マジで俺の糖分と時間返せやってなった。

 

なんかスクリプト以外に頼るのは負けた気がするんだけど、こんなことも思いつかないウンコに綺麗なスクリプトが書けるかって言われたら首を垂れるしかないので、今まで書いたゴミみたいなコードは全消しして作り直す。

 

つらい。

 

 

いいか?生成したいオブジェクトのパラメータが多いならもう1つprefubを作れよ。

 

 

以上。

 

【Unity】RectTransformのインスタンスとサイズの話

僕のunityを使ったお仕事では、だいたい(というか必ず)uGUIを使って実装するのだが、uGUIのGameObject(って表現があってるかわかんないけど)って普通のTransformと違ってちょっとめんどいだんよね。

 

なんで、毎回作る度にどっかしらつまずくんスよ。

ってことで、今日つまずいたとこを一応メモっとく。

 

 

uGUIをインスタンス化してなんかの子にするとき

まずは、uGUIのGameObjectをprefab化して、そいつをスクリプトでuGUIのGameObjectの子にインスタンス化するとき。

 

いつものTransformのGameObjectを子にインスタンス化するときは

 

public GameObject gObj; //uGUIのGameObject
public GameObject prefabObj; //上の奴の子にするprefab
void ObjInstantiate() //関数名は適当やで
{
GameObject ui= Instantiate ((GameObject)prefabObj);
ui.transform.parent = gObj.transform;
}

 とかって書くと思うんだけど、このとき

”Parent of RectTransform is being set with parent property. Consider using the SetParent method instead, with the worldPositionStays argument set to false. This will retain local orientation and scale rather than world orientation and scale, which can prevent common UI scaling issues.”

 っていう黄色エラーが出た。

 

まぁ黄色だから大丈夫だと思うんだけど、会社にいるプログラムの師匠に「わーにんぐ、きもい」って言われそうだった(ってか、見たことないエラーだったから自分でもキモイと思った。)ので、解決策を探した。

 

んで、こういう時は

ui.transform.parent = gObj.transform;

 のとこを

ui.transform.SetParent (gObj.transform);

 ってしたら黄色エラーが消えるんだってさ。

 

 

uGUIのサイズをスクリプトで変えるとき

RectTransformって普通のTransformの値のほかに、サイズとかアンカーとかピボットとかが追加されている。(Transformを継承してるからposition、rotation、Scaleもある)

 

んで、RectTransformはScaleで大きさを変えるんじゃなくて、Sizeってのを変えることでソースのImageに大きさをあわせることが多い。(ここも日本語あってるかわからん)

そのSizeってのはインスペクターで見るとWidthとかHeightって書いてあるやつね。

f:id:HarakeN:20161111183423p:plain

 

Sizeはpositionとかと違ってVector2なんすよ。

で、これにスクリプトで設定するには

 

public RectTransform uiObj;
void UiObjSize() //関数名は適当やで
{
uiObj.sizeDelta = new Vector2 (100,100); //サイズも適当やで
}

 

ってしてやれば指定の大きさにできるっぽい。