Unity 開発日記【9 日目】 - キャラクターの死、シーンの切り替え、照明効果

目次

1.キャラクターの死亡

2.シーンの切り替え 

 3. 2D ライト効果

 4. 最適化


1.キャラクターの死亡

プレイヤーの死に気付くことは、どのゲームでも非常に重要なことです. 次に、この効果を試します. まず、キャラクターが死ぬには、モンスターに攻撃されたり、罠にかかったり、落ちたりするなど、多くの条件があります.まずは高所から落下する仕組みを実装してみましょう。

実装方法はいろいろあります. ここではデッドラインとしてトリガーを使いたい. プレイヤーがデッドラインに触れるとすぐに死んでしまうので, 最初に空のプロジェクトを作成し, 次に衝突ボディを追加し, それを次のように変更します.トリガーのサイズを調整します 

次に、プレーヤーのスクリプトに移動してコードを記述します [注: ここでは、前のコレクションの衝突関数を使用できます。これはより適切に再利用できます]。プレーヤーが死亡した後、ゲーム シーンを再起動する必要があります。 function であるため、新しいヘッダー ファイルが必要です。

using UnityEngine.SceneManagement;

次に、シーンの再開機能を使用してプレーヤーの復活を実現します。コードは次のとおりです。

/* 角色下落死亡 */
if(collision.tag == "deadline")
{
    SceneManager.LoadScene(SceneManager.GetActiveScene().name); //重启当前场景
}

 GetActiveScene 関数を使用して現在のシーンの名前を取得します。これにより、シーンの名前を直接使用するため、別のゲーム シーンでコードを変更する必要があるという問題が回避されます。しかし、テストの結果、このリセット速度は非常に高速であり、遅延効果が必要であることがわかりました。

実装方法は非常にシンプルで、死亡条件が成立したことを確認した後、すぐに死亡するのではなく、Invoke関数を先に実行して一定時間遅延させてから、ReStart関数を実行します。

Invoke("ReStart", 0.5f); //延迟后执行死亡函数

2.シーンの切り替え 

次に、あるゲーム シーンから別のゲーム シーンに切り替えたいと考えています。私のアイデアは、前に次のレベルのダイアログ ボックスをトリガーした次のシーンをロードするコードを追加することです。このコードは、E が押されたときに実行されます。次のシーンをロードします。シーン (SceneManager.GetActiveScene().buildIndex で現在のシーンの番号を取得できます)

using System.Collections;
using System.Collections.Generic;
using UnityEngine.SceneManagement;
using UnityEngine;

public class EnterTwo : MonoBehaviour
{
    void Update()
    {
        if(Input.GetKeyDown(KeyCode.E)) //当按下E的时候
        {
            SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex+1); //加载下一个场景
        }
    }
}

このシーン番号をどこで設定またはソートしますか?

ファイル > ビルド設定を開くと、それが表示され、ここで他のゲーム シーンをインポートすることもできます。(設定したシーンで直接ドラッグできます)

ゲーム中にプレーヤーが誤って E キーに触れて、次のレベルを直接ロードするというバグを回避するために、デフォルトで閉じられているこの UI にコードをロードすることにしました。

 3. 2D ライト効果

ゲームの 2 番目のシーンでは、特殊な洞窟を作成したので、見栄えを良くするためにいくつかの光の効果を追加する必要があります.まず、マップと背景のマテリアルを Default - Diffuse に変更して、シーンが暗くなるようにします

この時点で、マテリアルが追加されていないため、キャラクターがまだ明るいことがわかりました.マテリアルを変更する必要があり、シーン内のすべてが暗くなった後、光源を追加しようとします(ゲームは2Dです点光源には光がなく、Z軸を調整する必要があります.同様に、マテリアルを追加した後、シーン内の元のオブジェクトが表示されず、Z軸が表示されない場合があります.軸を調整する必要があります)

このようにして、光源を実現し、同じ原理でプレーヤーに光源を追加できます。

 

それでおしまい。 

 注: ここでディレクショナル ライトを使用して、シーン全体を照らすことができます。

 4. 最適化

 すべてのアイテムにコレクション アニメーションを追加しました. アニメーションの制作は非常に簡単です. 追加されたロジックはモンスターの死のロジックと同じであるため, Player 内のコードを削除し、各コレクション アイテムに移動しました. (コレクションは2つしかないので、別々に実装し、クラスと一緒に実装しませんでした)

コレクション スクリプト: このコードは、プレイヤーがトリガーしたときにコレクション アニメーションを再生することを意味します。アニメーションが再生された後、Destory 関数を実行するためにイベントが呼び出されます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Cherry : MonoBehaviour
{
    public Animator Anim;
    public Collider2D Coll;

    private void OnTriggerEnter2D(Collider2D collision) //碰撞器触发函数
    {
        if(collision.tag == "Player")
        {
            Anim.SetTrigger("getting");
        }
    }

    public void Destory()
    {
        Destroy(gameObject);
    }
}

 文字制御スクリプト:

    private void OnTriggerEnter2D(Collider2D collision) //碰撞器触发函数
    {
        /* 物品收集 */
        if(BodyColl.IsTouching(collision) && collision.tag == "cherry") //樱桃收集
        {
            collision.enabled = false;
            CherryAudio.Play();
            CherryCount++; //收集品数量加一
            CherryNumber.text = CherryCount.ToString();
        }
        if (BodyColl.IsTouching(collision) && collision.tag == "gem") //宝石收集
        {
            collision.enabled = false;
            GemAudio.Play();
            GemCount++; //收集品数量加一
            GemNumber.text = GemCount.ToString();
        }
    }

ここで、衝突を確認したら、まずコライダーを閉じて、アニメーションの再生中にトリガーが繰り返されないようにします。

おすすめ

転載: blog.csdn.net/qq_50688324/article/details/127071242