おすすめの読み物
みなさん、こんにちは。私は仏教のエンジニアです☆静かな小さな魔法のドラゴン☆。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エディターを使用してプロジェクトを開発する過程で発生したバグと落とし穴を記録して、後で参照できるようにします。 |