Nanashi-soft

Nanashi-softの活動状況とか雑談です。 Unity3Dでゲーム作っています。

●もっと広いマップを作りたい
デフォルト状態では500m四方です
せっかく生成しながら移動できる仕組みなのですから,広大なマップにしたい

ベースがテレインなので,同じ場所で調整できるのでは?
シーン上の Forestオブジェクトの Inspectorに Terrainがある
そこの設定アイコン(ギアの形)をクリック
Resolutionにサイズ設定があります
【注意】マップサイズを変更すると,これまで行ったものが全て消去されてしまいます

設定内容の詳細は Unityマニュアルにあります
https://docs.unity3d.com/ja/540/Manual/terrain-OtherSettings.html

サイズを変更すると,配置していたオブジェクトもリセットされますので,再度生成し直します
Rebuild all meshesボタンをクリック

あと,テレインオブジェクトを回転させたり,スケールを変えたりはしないでください(それをするとシェーダーが誤動作するかも知れないとマニュアルに書いてある)


〇Could not find methodエラーが多発した場合
↓こういうエラーが無数に表示された
Could not find method 
UnityEngine.Debug:LogError(Object)
VEAGames.LAM.Editor.DecoratorEditor:CallInspectorMethod(String) (at Assets/Plugins/LandscapeAutoMaterial/Editor/DecoratorEditor.cs:131)
VEAGames.LAM.Editor.DecoratorEditor:OnSceneGUI() (at Assets/Plugins/LandscapeAutoMaterial/Editor/DecoratorEditor.cs:249)
VEAGames.LAM.Editor.TerrainEditorDecorator:OnSceneGUI() (at Assets/Plugins/LandscapeAutoMaterial/Editor/TerrainEditorDecorator.cs:183)
UnityEditor.DockArea:OnGUI()

何のエラーなのかわからないので,コメントアウトして黙らせる(ぉ
DecoratorEditor.csの131行目の先頭に//を付けて保存する
//                    Debug.LogError(string.Format("Could not find method {0}", method));

これはエディタ上で動作するスクリプトで,実際のゲームには影響が無い
恐らく設定を変える事で初期化されるためで,これから元通りオブジェクトを置いていく間にエラーが解消されるものと思われる

●草を風になびかせたい
Unityの WindZoneと連携するようです

1.Unityメニューの GameObject→3D Object→Wind Zoneでシーン上に WindZoneオブジェクトを追加
2.Inspectorの Add Componentボタン→Scripts→VEAGames.LAM→LAM Windを追加

そうすると,草が風になびくようになります
ちょっと強風すぎるので調整方法を模索中ですが(*'-')

●樹木を生やしたい
草は自動的に生えるのですが,樹木は生えません
デモ動画を見ると,樹木も沢山生えていますので,できるはずです

https://youtu.be/XqRax4xPy_M
このチュートリアル動画で,樹木を置いているようなのですが,解像度が悪くて何をやっているのかよくわからない(ぁ

でも,通常のテレインには設定アイコンの右には何もありませんので,きっとそこに秘密がある('-'*)
クリックすると,Multi-paint foliageと表示される。foliageと言えば下にある LAM Batched Foliageですよね?

そこから,試行錯誤の末,樹木を置く方法がわかりました

〇樹木を手動で置く方法
jyumoku1
Inspectorの Terrainの一番右にあるアイコンをクリックして,Multi-paint foliageモードにする

jyumoku2
Selected presetのプルダウンをクリックして,Leave Treesを選択する

jyumoku3
Paintsに表示された Tree_Leave_04(#26)~をクリックして選択して,Densityを 1に設定する

この状態でシーン上をクリックすると,そこに樹木が配置されます

尚,何に影響があるのかわからない為,Updateは押さずに毎回 Densityを 1に設定し直した方が良いです
もう少し解析を進めたら,きちんと設定保存可能な方法がわかるでしょう

つづき)

まだまだ,Sequenceに突っ込んでいきます。どんだけ長くなるんだよと(*'-')
画面からはみ出て線が引けないよ!

↓最後に,ユニティちゃんのソース中では先頭に書かれていた,アニメーター用の部分を追加します
anim.SetFloat ("Speed", v); // Animator側で設定している"Speed"パラメタにvを渡す
anim.SetFloat ("Direction", h); // Animator側で設定している"Direction"パラメタにhを渡す
anim.speed = animSpeed; // Animatorのモーション再生速度に animSpeedを設定する
44.Tasks→Actions→Basic→Animator→Set Float Parameterを追加し,Sequenceの下に追加
45.Set Float Parameterの Inspector→Target Game Objectは None,Paramater Nameに Speed,Float Valueに vartial変数,Set Onceのチェックは外すに設定する
46.Tasks→Actions→Basic→Animator→Set Float Parameterを追加し,Sequenceの下に追加
47.Set Float Parameterの Inspector→Target Game Objectは None,Paramater Nameに Direction,Float Valueに horizontal変数,Set Onceのチェックは外すに設定する
48.Tasks→Actions→Basic→Animator→Set Speedを追加し,Sequenceの下に追加
49.Set Speedの Inspector→Target Game Objectは None,Speedに 1.5を設定
ここの Speedは本来 animSpeed変数なので,元ソースと同じように変数にして可変にしても良いと思います

これで実行すると,ユニティちゃんが走り回ります
画面上でマウスを動かしても,ユニティちゃんが走り回ります

つづき)

まだ続きます('-'*)
↓この部分ですが,BehaviorDesignerに if文は無い(と思う)ので,Selectorを使ってどれかを実行にします
if (v > 0.1) {
velocity *= forwardSpeed; // 移動速度を掛ける
} else if (v < -0.1) {
velocity *= backwardSpeed; // 移動速度を掛ける
}
12.Tasks→Composites→Selectorを追加し,Sequenceの下に追加
まずは,if (0.1 < v)の部分を作る(私の自分ルールで必ず左が小さいなので逆にした)
13.Tasks→Composites→Sequenceを追加し,その Selectorの下にくっつける
14.Tasks→Conditionals→Basic→Math→Float Comparisonを追加して,その Sequenceの下にくっつける
15.Float Comparisonの Inspector→Operationに Less Than,Float 1に 0.1,Float 2に vertical変数を設定
そこに if文が成立した時の処理を追加する
16.Tasks→Actions→Basic→Vector3→Multiplyを追加し,Sequenceの下に追加して,Float Comparisonの右に置く
17.Multiplyの Inspector→Vector 3 Variableに velocity変数,Multiply Byに 7,Store Resultに velocity変数を設定
ここの Multiply Byは本来 forwardSpeed変数なので,元ソースと同じように変数にして可変にしても良いと思います

次に else if(v < -0.1)の部分を作る
18.Tasks→Composites→Sequenceを追加し,Selectorの下に追加して,最初の if文の Sequenceの右に置きます
19.Tasks→Conditionals→Basic→Math→Float Comparisonを追加して,その Sequenceの下にくっつける
20.Float Comparisonの Inspector→Operationに Less Than,Float 1に vertical変数,Float 2に -0.1を設定
21.Tasks→Actions→Basic→Vector3→Multiplyを追加し,Sequenceの下に追加して,Float Comparisonの右に置く
22.Multiplyの Inspector→Vector 3 Variableに velocity変数,Multiply Byに 2,Store Resultに velocity変数を設定
ここの Multiply Byは本来 backwardSpeed変数なので,元ソースと同じように変数にして可変にしても良いと思います

これで if文は終わりなのですが,実はこのままでは,両方の条件を満たさなかった場合に,上の Selectorに trueが返らないので処理が終わってしまいます
そこで,最後に適当なダミー処理を追加しておきます
23.Tasks→Actions→Basic→Time →Get Timeを追加して,Selectorにくっつけて,一番右に置く

その次にあるジャンプ処理はスキップして,その次の処理,
// 上下のキー入力でキャラクターを移動させる
transform.localPosition += velocity * Time.fixedDeltaTime;
Time.fixedDeltaTimeというのは,FixedUpdateメソッド用なので,通常の Time.DeltaTimeを取得して使用します
24.Variables→Nameに deltatime,Typeに Floatで Add
25.Tasks→Actions→Basic→Time→Get Delta Timeを追加
26.Sequenceの下にくっつけて,先ほどの if文の Selectorの横に置きます(中じゃないですよ)
27.Get Delta Timeの Inspector→Store Resultに deltatime変数を設定
28.Tasks→Actions→Basic→Vector3→Multiplyを追加し,Sequenceの下に追加
29.Multiplyの Inspector→Vector 3 Variableに velocity変数,Multiply Byに deltatime変数,Store Resultに velocity変数を設定
30.Variables→Nameに localposition,Typeに Vector3で Add
31.Tasks→Actions→Basic→Transform→Get Local Positionを追加,Sequenceの下に追加
32.Get Local Positionの Inspector→Target Game Objectは Noneのまま(実行時に自身のオブジェクトがセットされます),Store Valueに localposition変数を設定
33.Variables→Nameに PlayerPos,Typeに Vector3で Add
Propertyの右の三角→unitychan_dynamic_locomotion→Transform→positionを設定
34.Tasks→Actions→Basic→Vector3→Operatorを追加し,Sequenceの下に追加
35.Operatorの Inspector→Operationに Add,First Vector 3に localposition変数,Second Vector 3に velocity変数,Store Resultに PlayPos変数を設定

あとはコレ
// 左右のキー入力でキャラクタをY軸で旋回させる
transform.Rotate (0, h * rotateSpeed, 0);
36.Variables→Nameに rotatespeed,Typeを Floatで Add
37.Tasks→Actions→Basic→Math→Float Operatorを追加し,Sequenceの下に追加
38.Float Operatorの Inspector→Operationを Multiply,Float 1を horizontal,Float 2を 2,Store Resultを rotatespeed変数に設定する
ここの Float 2は本来 rotateSpeed変数なので,元ソースと同じように変数にして可変にしても良いと思います
39.Variables→Nameに rotate,Typeに Vector3で Add
40.Tasks→Actions→Basic→Vector3→New Vector 3を追加(※自作していなければ存在しません)し,Sequenceの下に追加
41.New Vector 3の Inspector→Float Value Xに 0,Float Value Yに rotatespeed,Float Value Zに 0,Vector 3 Variableに rotate変数を設定
42.Tasks→Actions→Basic→Transform→Rotateを追加し,Sequenceの下に追加
43.Rotateの Inspector→Target Game Objectはデフォルトの Noneのまま,Euler Anglesに rotate変数,Relative Toに Selfを設定

これで,動き回れるようになっているはずです

つづく)

つづき)

取得した Axisの値を使って実際にキャラを動かす処理を作ります
これは,ユニティちゃんアセットの UnityChanControlScriptWithRgidBodyスクリプトの内容をそのまま再現してみます
ただし,そのソースのコメントにあるように,ジャンプをするには物理エンジンが絡むので FixedUpdateに記述する必要があって,難しくなるので省きます

まずは,取得した horizontalと verticalを -1.0~1.0の間に丸め込みます
そうしないと具合が悪かったからです(*'-')
1.Tasks→Composites→Sequenceを追加
2.Parallelの下にくっつけて,一番右に置く。以降の説明は全てこの Sequenceの下に繋げていきます
3.Tasks→Actions→Basic→Math→Float Clampを追加し,Sequenceの下にくっつける
4.Float Clampの Inspector→Nameを -1 <= H <= 1のようなわかり易い名称にして,Float Variableの右の黒丸→horizontal変数,Min Valueに -1,Max Valueに 1を設定
5.同様に,Tasks→Actions→Basic→Math→Float Clampを追加し,Sequenceの下に追加
6.Float Clampの Inspector→Nameを -1 <= V <= 1のようなわかり易い名称にして,Float Variableの右の黒丸→vertical変数,Min Valueに -1,Max Valueに 1を設定

↓ここからユニティちゃんの移動スクリプトを再現していくのですが,いきなり既存 Taskでは困難な処理から始まります
// 以下、キャラクターの移動処理
velocity = new Vector3 (0, 0, v); // 上下のキー入力からZ軸方向の移動量を取得
そう,これの為に少し前のブログ記事で自作 Taskの作り方を書いたのです('-'*)
その時に作った New Vector3を使います
7.Variables→Nameに velocity,Typeに Vectorで Add
8.Tasks→Actions→Basic→Vector3→New Vector 3を追加(※自作していなければ存在しません)し,Sequenceの下に追加
9.New Vector 3の Inspector→Float Value Xに 0,Float Value Yに 0,Float Value Zに vertical変数,Vector 3 Variableに verocity変数を設定する

↓次の transform.TransformDirectionも存在しないので,タスクを作ります
// キャラクターのローカル空間での方向に変換
velocity = transform.TransformDirection (velocity);
a.Projectの下の Create→C# Scriptを追加
b.ファイル名を TransformDirectionに変更する(C#はファイル名=クラス名)
c.以下のプログラムに書き換える
using UnityEngine;

namespace BehaviorDesigner.Runtime.Tasks.Basic.UnityTransform
{
    [TaskCategory("Basic/Transform")]
    [TaskDescription("transform.TransformDirection")]
    public class TransformDirection : Action
    {
        [Tooltip("The Vector3 to get the values of")]
        public SharedVector3 vector3Value;
        [Tooltip("The Vector3 to set the values of")]
        public SharedVector3 vector3Variable;

        public override TaskStatus OnUpdate()
        {
            vector3Variable.Value=transform.TransformDirection(vector3Value.Value);
            return TaskStatus.Success;
        }

        public override void OnReset()
        {
            vector3Value = vector3Variable = Vector3.zero;
        }
    }
}

そのまんま,transform.TransformDirectionを突っ込んだ何の捻りも無いプログラムです
恐らく,こういう既存システムに追加するものは,Unity機能そのままのものが使い勝手も良いと思います

これを使って,移動計算を続けます
10.Tasks→Actions→Basic→Transform→Transform Directionを追加(※自作していなければ存在しません)し,Sequenceの下に追加
11.Transform Directionの Inspector→Vector 3 Valueに velocity変数,Vector 3 Variableに velocity変数を設定

長くなるので,記事を分けます('-'*)

つづく)

↑このページのトップヘ