2
0

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 3 years have passed since last update.

[Unity]Unityのみの機能を使い中間フラッグ(旗)を作る!

Last updated at Posted at 2021-02-22

はじめに

今回は下の動画のような中間フラッグをUnityの機能だけを用いて制作します。
今回は旗の制作のみです。次回にゲームオーバーになった時に中間フラッグの位置からゲームを再開する方法について解説するつもりです。
Flag005.gif

環境

Unity 2019.3.15f1

目次

  1. モデリングをする
  2. マテリアルとシェーダを作成、適用させてフラッグを作る
  3. フラッグを回転させる
  4. キラキラエフェクトを付ける

1.モデリングする

まず、Hierarchy ウィンドウに以下のようなFlagツリーを作成します。
FlagTree.PNG
手順
Hierarchy ウィンドウ内で右クリックして Create Empty を作成して名前をFlagに変更する。

Hierarchy ウィンドウ内にある作成したFlagを右クリックしてもう一度Create Empty を作成して名前をFlagModelに変更する。

Hierarchy ウィンドウ内にある作成したFlagModelを右クリックして 3DObject > Plane をクリックしてプレーンを作成し、名前をClothに変更する。

同様にFlagModelを右クリックして 3DObject > Cylinder  で円柱を作成し Bar
                 3DObject > Sphere   で 球を作成し Bar_Top
                 3DObject > Cylinder  で 円柱を作成し Bar_Base を作成する。

次に、作成したCloth、Bar、Bar_Top、Bar_Base のInspector内にあるTransformを変更して、フラッグの形状にします。
FlagModel1.png
上の画像のようにTranformを変更しました。
各自好みで変更してください。

以上でモデリングは終了です。

2.マテリアル、シェーダの作成と適用

次はフラッグのマテリアルおよびシェーダを作成して、それを適用させます。
それによりフラッグの布部分をなびかせたり、棒部分をより金属のように見えるようにします。

プロジェクトに以下のフォルダを作成します。
Mat1.PNG
手順
プロジェクト内のどこでもいいのでFlagフォルダを作成します。
プロジェクトビュー内で右クリック Create > Folder でフォルダを作成して名前をFlagに変える。

そのフォルダ内にマテリアル2つ、シェーダ1つ、テクスチャー1つを作成します。
プロジェクトビューのFlagフォルダ内で右クリック Create > Material でマテリアルを作成し、名前をBarに変更
同様に Create > Material でマテリアルを作成し、名前をClothに変更
    Create > Shader > Standard Surface Shader シェーダを作成し、名前をClothに変更

フラッグの布部分に使うテクスチャを自前で用意します。
テクスチャはjpgかpngファイルなら何でもいいので好きなものを使用してください。

それを、プロジェクトビューのFlagフォルダ内にドラック&ドロップで追加してください。
Mat3.png
次に、シェーダの中身を変更します。

作成したシェーダのCloth をダブルクリックで開き、以下に書いているコードに変更します。
このシェーダを使うことで布部分のなびかる表現ができます。
シェーダの詳しい説明はややこしくなるので省きます。
以下のコードをコピペしてもらえばいいです。

Cloth.shader
Shader "Custom/Cloth"
{
	Properties
	{
		_Color("Color", Color) = (1,1,1,1)
		_MainTex("Albedo (RGB)", 2D) = "white" {}
	}
	SubShader
	{
		Tags { "RenderType" = "Opaque" }
		LOD 200

		CGPROGRAM
		#pragma surface surf Lambert vertex:vert

		// Use shader model 3.0 target, to get nicer looking lighting
		#pragma target 3.0

		sampler2D _MainTex;

		struct Input
		{
			float2 uv_MainTex;
		};

		fixed4 _Color;

		void vert(inout appdata_full v, out Input o)
		{
			UNITY_INITIALIZE_OUTPUT(Input, o);
			float amp = 0.1*sin(_Time * 100 + v.vertex.x * 100);
			v.vertex.xyz = float3(v.vertex.x, v.vertex.y + amp, v.vertex.z);
		}

		void surf(Input IN, inout SurfaceOutput o) 
		{
			fixed4 c = tex2D(_MainTex, IN.uv_MainTex)* _Color;
			o.Albedo = c.rgb;
			o.Alpha = c.a;
		}
		ENDCG
	}
	FallBack "Diffuse"
}

参考記事 【Unityシェーダ入門】シェーダで旗や水面をなびかせる
詳しい原理などは上記の記事を見てください。

これで使用するアイテムの準備は終了です。

次に作成したこれらのアイテムを適用させていきます。

まず、マテリアルのClothシェーダのClothをドラック&ドロップしてClothマテリアルにシェーダを適用させます。
Mat6.png
すると、マテリアルのClothが以下のように変化するので、Flagのテクスチャ(jpgかpngファイル)を下図のようにドラッグ&ドロップして、ClothマテリアルにFlagテクスチャーを適用させます。
Mat7.png

次にマテリアルを最初にシーンに作成したオブジェクトに適用させます。
最初にClothのマテリアルをシーンに配置したClothオブジェクトに適用させます。

やり方は2通りあります。直接シーンに配置しているオブジェクトにドラック&ドロップする方法と、オブジェクトのインスペクターにあるMesh Renderer の Materials Element0 のところにドラック&ドロップする方法です。
やりやすい方法を用いてください。
Mat8.png
同様の方法でシーンにある Bar、Bar_Top、Bar_Baseに対して Barマテリアルを適用させます。

そうすると以下のようになります。
sg43k-7imat.gif

フラッグのオブジェクトが完成に近づいてきました。
しかし、現状ではBarに使われているマテリアルを何も触っていなので、デフォルトの状態です。

BarマテリアルAlbedo、Metallic、smoothnessの値を変更します。
下の写真のように変更しましたが、各自の好みで変更してください。
Mat11.PNG
これで以下のような旗が完成します。
icdrk-ukuvg.gif
ただし、この状態ではひとつ問題があります。

それは、カメラの向きを変えて裏面を表示させると、下の写真のような表示に変わってしまいます。
Mat10.PNG
旗の布部分が消えてしまいます。これは3DObjectのPlaneが裏面を表示できないためにこのようになってしまいます。

これを直す方法は単純です。Plane部分のオブジェクトを複製して、裏面を向けた状態で配置するだけです。
やり方はHierarchy ウィンドウ内にあるClothを選択して、ショートカットコマンドの Ctrl + D を押してClothオブジェクトを複製します。
Mat9.png
複製してできた Cloth (1) のTransfromのRotation x-90 から 90 に変更します。
Mat10.png
これで360°どこから見てもフラッグに見えるようになります。
FlagModel自体はこれで完成です。

3.フラッグを回転させる

今度はこの作成したフラッグを回転させます。
フラッグを回転させたくないって人はとばしてくれてOKです。

まず、FlagController スクリプトを作成します。
プロジェクトのFlagフォルダ内で 右クリックして Create > C# Script でスクリプトを作成して名前を FlagController にします。

作成した FlagControllerHierarchy ウィンドウ にある Flag オブジェクトにドラッグ&ドロップしてアタッチします。
Qiita3.png
このとき、スクリプトの名称とスクリプト内のclass名が一致していないとアタッチできないので注意しましょう。

アタッチできたら、FlagController を開きます。

オブジェクトを回転させる方法はいろいろありますが、今回は transform.eulerAngles を少しずづ変更することで回転させます。

FlagController に2行だけ追加して以下のように書き換えます。

FlagController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FlagController : MonoBehaviour
{
    //回転スピード
    [SerializeField] private Vector3 RotationSpeed = new Vector3(); //←追加

    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        //オイラー角を変更する
        transform.eulerAngles += RotationSpeed * Time.deltaTime; //←追加
    }
}

スクリプトの書き換えができたら、Unityに戻り、シーンにある Flagオブジェクト のインスペクタ FlagController スクリプト内の RotationSpeed の値を下の画像のように変更します。
Qiita4.png

回転してるかを確かめるためにPlayボタン(▶ボタン) でシーンを実行すると以下のようになります。
Flag003.gif
次にフラッグ全体に傾きを付けます。

Hierarchy ウィンドウ の Flagオブジェクトツリー内の FlagModelTransform の値を変更します。
下の画像のように変更します。
Qiita5.png
Playボタン(▶ボタン) でシーンを実行して確認すると以下のようになります。
Flag004.gif
これで、オブジェクトの回転は終了です。

4.キラキラエフェクトを付ける

最後にキラキラエフェクトを付けます。
今回は1からエフェクトを作成するのではなく、無料Assetをダウンロードして、それを変更して使います。

まず、Asset Store から以下の無料Effect をダウンロードします。

インストールできたら、プロジェクト内にJMO Assets というフォルダが追加されると思います。
今回は、JMO Assets内にある CFX2_PickupStar というエフェクトを使用します。

JMO Assets > Cartoon FX > CFX2 Prefabs > Pickup Item 内にある CFX2_PickupStar をFlagオブジェクトにドラッグ&ドロップします。
Qiita6.png

Flagツリー内に追加された CFX2_PickupStar を右クリックして Unpack Prefab します。
この操作は、このシーンに配置したCFX2_PickupStarを変更しても、元のCFX2_PickupStarのプレハブに影響を与えないために必要になります。
Flag007.PNG
今回使うのは、CFX2_PickupStar ツリー内にある ShinyStars Small だけです。
ですので、ShinyStars Small を Flag にドラッグ&ドロップして ShinyStars Small を Flag 直下にもってきます。
Qiita7.png
残りの CFX2_PickupStar は不要なので消去して下の画像のような状態にします。
flag009.PNG
次に ShinyStars Small のインスペクタを変更します。

変更するところはTransformPosition、Scaleをそれぞれ、画像のように02に変更し、
Pirticle SystemLooping にチェックを入れるだけです。
Qiita8.png
これだけで、キラキラエフェクトの追加は終了です。

Playボタン(▶ボタン) でシーンを実行すると以下のようになります。
Flag005.gif

これでフラッグの完成です!

おわりに

今回はUnityのみの機能を使い、マリオなんかで使われているような中間フラッグを作ってみました。
3Dの物をモデリングする場合は Blender などの外部ツールを用いるのが一般的だと思いますが、こういった単純な物の場合はUnityだけで作ったほうが簡単な場合があります。
何か物を作る際には、こういった方法も使ってみてください。

次回はこのフラッグを使い、ゲームオーバーしたら中間地点から開始という機能を作りたいと思います。

この中間フラッグを実際に使ったゲームをアップルストアとグーグルプレイで公開しています。
無料でプレイ可能なので、少しでも興味を感じた人はプレイしてみてください。

2
0
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
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?