【Unity3D日々の開発】Unity3Dのターゲットポイントを指す矢印の効果

おすすめの読み物

みなさん、こんにちは。私は仏教のエンジニアです☆静かな小さな魔法のドラゴン☆。Unityの開発スキルを随時更新しています。便利だと思ったら、忘れずに3回クリックしてください。

I.はじめに

最近開発していたときに、矢印ポインティングの必要性に遭遇しました。もともとは私の記事のコードを使用したかったのです:
[Unity3Dの毎日の開発]Unityでの矢印ポインティング効果の実装

しかし、このコードはUpdateで実行されていると思いました。これは、効率に大きな影響を与えます。このクラスメートが私にメッセージを残しているのを見たばかりです。

ここに画像の説明を挿入
ShaderとMeshRendererを使用して彼の実装を確認したところ、効率が向上するはずです。しかし、記事の手順は私にとっては少し単純であり、使用方法がわからない可能性があるため、内容を細かく分割します。

効果画像:
ここに画像の説明を挿入

元のリンク:http
://www.devacg.com/?post = 1415著者:風の剣の愛を追いかける
最初に公開された:個人ブログhttp://www.devacg.com/

2.テキスト

2-1.シェーダーを作成する

(1)まず、画像をインポートします。
ここに画像の説明を挿入
右クリックして名前を付けて保存し、プロジェクトに保存します。

(2)新しいシェーダーを作成し、プロジェクトビューで選択してCreate→Shader→Standard Surface Shader
ここに画像の説明を挿入
、コードをコピーして貼り付けます。

Shader "Custom/NavPathArrow"
{
    
    
    Properties
    {
    
    
        _MainTex("Texture", 2D) = "white" {
    
    }
        _ScrollYSpeed("Y Scroll Speed", Range(-20, 20)) = 2
    }
        SubShader
        {
    
    
            Tags {
    
     "Queue" = "Transparent" "RenderType" = "Transparent" }
            LOD 100
            //双面渲染
            Cull Off
            //Alpha混合
            Blend SrcAlpha OneMinusSrcAlpha

            Pass
            {
    
    
                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag

                #include "UnityCG.cginc"

                struct appdata
                {
    
    
                    float4 vertex : POSITION;
                    float2 uv : TEXCOORD0;
                };

                struct v2f
                {
    
    
                    float2 uv : TEXCOORD0;
                    float4 vertex : SV_POSITION;
                };

                sampler2D _MainTex;
                float4 _MainTex_ST;
                fixed _ScrollYSpeed;

                v2f vert(appdata v)
                {
    
    
                    v2f o;
                    o.vertex = UnityObjectToClipPos(v.vertex);
                    o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                    return o;
                }

                fixed4 frag(v2f i) : SV_Target
                {
    
    
                    fixed2 uv = i.uv;
                    uv.y += _ScrollYSpeed * _Time;
                    fixed4 col = tex2D(_MainTex, uv);
                    return col;
                }
                ENDCG
            }
        }
}

2-2.シェーダーを作成する

新しいシェーダーを作成し、プロジェクトビューで選択してCreate→Material、名前を付けますNavPathArrow
ここに画像の説明を挿入
シェーダーのプロパティを設定し、シェーダーをに設定してCustom/NavPathArrow、テクスチャをその中にドラッグします。
ここに画像の説明を挿入

2-3.プレハブの作成

(1)新しいQuadオブジェクトを作成し、階層ビューで右クリックして次を選択しますCreate→Quad

ここに画像の説明を挿入
そのシェーダーを先ほど作成したシェーダーに置き換えます。
ここに画像の説明を挿入
プロジェクトビューにドラッグしてプレハブを作成します。
ここに画像の説明を挿入

2-4.実装コード

新しいスクリプトNavPathArrow.csを作成し、ダブルクリックしてスクリプトを開き、コードを記述します。

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

/// <summary>
/// 导航箭头
/// </summary>
public class NavPathArrow : MonoBehaviour
{
    
    
    public MeshRenderer meshRenderer;//箭头3D对象Quad
    public List<Transform> points = new List<Transform>();//路径点
    private List<MeshRenderer> lines = new List<MeshRenderer>();//显示的路径

    public float xscale = 1f;//缩放比例
    public float yscale = 1f;

    void Start()
    {
    
    
        //箭头宽度缩放值
        xscale = meshRenderer.transform.localScale.x;
        //箭头长度缩放值
        yscale = meshRenderer.transform.localScale.y;
    }

    //画路径
    public void DrawPath()
    {
    
    
        if (points == null || points.Count <= 1)
            return;
        for (int i = 0; i < points.Count - 1; i++)
        {
    
    
            DrawLine(points[i].position, points[i + 1].position, i);
        }
    }

    //画路径 参数为路径点数组
    public void DrawPath(Vector3[] points)
    {
    
    
        if (points == null || points.Length <= 1)
            return;
        for (int i = 0; i < points.Length - 1; i++)
        {
    
    
            DrawLine(points[i], points[i + 1], i);
        }
    }

    //隐藏路径
    public void HidePath()
    {
    
    
        for (int i = 0; i < lines.Count; i++)
            lines[i].gameObject.SetActive(false);
    }

    //画路径
    private void DrawLine(Vector3 start, Vector3 end, int index)
    {
    
    
        Debug.Log(transform.gameObject.name);
        MeshRenderer mr;
        if (index >= lines.Count)
        {
    
    
            mr = Instantiate(meshRenderer);
            lines.Add(mr);
        }
        else
        {
    
    
            mr = lines[index];
        }

        var tran = mr.transform;
        var length = Vector3.Distance(start, end);
        tran.localScale = new Vector3(xscale, length, 1);
        tran.position = (start + end) / 2;
        //指向end
        tran.LookAt(end);
        //旋转偏移
        tran.Rotate(90, 0, 0);
        mr.material.mainTextureScale = new Vector2(1, length * yscale);
        mr.gameObject.SetActive(true);
    }

    void OnGUI()
    {
    
    
        if (GUI.Button(new Rect(20, 40, 80, 20), "显示路径"))
        {
    
    
            DrawPath();
        }
        if (GUI.Button(new Rect(20, 80, 80, 20), "隐藏路径"))
        {
    
    
            HidePath();
        }
    }
}

2-5.関数を実装する

パスポイントとして3つの新しい立方体を作成し、1つの平面を床として作成し、コマンドを使用してカメラをCtrl+Shift+Fウィンドウに直接位置合わせします。
ここに画像の説明を挿入
スクリプトを平面にアタッチし、3つの立方体であるパスポイントをドラッグしてから、プレハブをドラッグします。それにクワッド:
ここに画像の説明を挿入
プログラムを実行します:
ここに画像の説明を挿入

3.追記

あなたの好きなものはブロガーへのあなたのサポートです。質問がある場合は、メッセージを残すことを忘れないでください:
ここに画像の説明を挿入

ブロガーはまたあなたが発見するのを待っている多くの宝物記事を持っています:

方向 序章
Unity3Dは小さなゲームを開発します 小さなゲーム開発チュートリアル Unity3Dエンジンを使用して開発されたいくつかの小さなゲームを共有し、小さなゲームを作成するためのいくつかのチュートリアルを共有します。
Unity3Dのエントリーからアドバンストまで 入門 自習用のUnityからインスピレーションを得て、C#とUnityの知識を活用して、Unityをゼロから学習するルートを要約します。
Unity3D之UGUI UGUI UnityのUIシステムUGUIは、UGUIの基本的なコントロールから始めて、UGUIの原理とUGUIの使用法を包括的に教えることから完全に分析されます。
Unity3D読み取りデータ 読み取ったファイル Unity3Dを使用して、txtドキュメント、jsonドキュメント、xmlドキュメント、csvドキュメント、およびExcelドキュメントを読み取ります。
Unity3Dデータ収集 データ収集 配列コレクション:配列、リスト、辞書、スタック、リンクリストなどのデータコレクションの知識共有。
Unity3DのVR/AR(仮想シミュレーション)開発 バーチャルリアリティ ケースの説明のために、ブロガーの仕事の一般的な仮想シミュレーション要件を要約します。
Unity3D用のプラグイン プラグイン Unityの開発、プラグインの紹介などで使用されるプラグインの使用方法を主に共有します。
Unity3Dの日々の開発 デイリーレコード 主にブロガーが日常の開発、使用する方法とスキル、開発のアイデア、コード共有などで使用します。
Unity3Dの毎日のバグ デイリーレコード Unity3Dエディターを使用してプロジェクトを開発する過程で発生したバグと落とし穴を記録して、後で参照できるようにします。

おすすめ

転載: blog.csdn.net/q764424567/article/details/123811819