I.はじめに
こんにちは、私は新しいです。
事はこんな感じで、浜崎あゆみの歌を聴いていたらMY ALL
、涙が溢れ、メロディーが始まり、Ye Qinghui、
【4Kコレクション並みの画質】浜崎あゆみの神曲「マイオール」を歌って観客を泣かせた!! !
Unity
Kugou をクリックして詳しく調べたところ、浜崎あゆみのこの曲だけを再生して、高品質の模造 Kugou 音楽プレーヤーとして使用できないかというアイデアが浮かびました。というわけで
作ってみたのですが、最終的な効果は以下の
通り
です。exe
2.UI素材を入手する
以下は本当にクールな犬のインターフェースです.インターフェースに従って, アリのアイコンライブラリにアクセスしてhttps://www.iconfont.cn/アドレスアリのアイコンライブラリのを
必要な素材アイコンを検索して見つけてください.アイコンをクリックすると、最初にアイコンの色を白に設定してからダウンロードすることができます、など 、私が探している資料は次のとおりです。そうしないと、この楕円形のボタンのように変形する可能性があります。
我的电台
电台
UI
Sprite (2D and UI)
UI
3. UGUIを使ってインターフェースを作る
最終的なインターフェース効果は次のとおりです。
以下のキーポイントを取り上げます。
1.インターフェースのレイアウト
インターフェースの作成を始める前にUI
、まずインターフェースのレイアウトを分析する必要があります.まず、大きなレイアウトの観点から、上部、中間、および下部です.
インターフェースを作成するときは、上部に従って行います. , 中央部と下部,次のように
.このように、次のように、中央を、 、の 3 つの部分に分けることができます。 など、大きなレイアウトに小さなレイアウトを埋め込み、小さなレイアウトに小さなレイアウトを埋め込み続け、インターフェースに応じて合理的に設計します。
我的音乐
tabs
left
right
2.アカウント円形アバター
アバター画像は次のように正方形です:
丸いアバターを表示する必要があり、コンポーネントを使用できますMask
. 次のhead_frame
ノードは画像を
使用して圆形
表示し、コンポーネントを吊るしますMask
.
子ノードはhead_img
アバター画像です.コンポーネントを
使用して表示しますRawImage
アバターの
効果は次のとおりです。
3. 検索ボックス
検索ボックスは、次のようにInputField
、コンポーネントを使用して
ボックスの画像を置き換え、色を設定します。
検索ボックスに別のコンポーネントを配置してButton
、虫眼鏡の画像を表示します。
効果は次のとおりです。
4.UIレイヤーを調整する
我的音乐
このボタンは
手前に表示するのが正解です
が、ブロックされているのは、UGUI
デフォルトではノードの順番で描画するようになっていて、後ろのボタンは下に配置されているので、後ろのボタンで隠れてしまうからです
。ノードの順序を調整したくないが、我的音乐
ボタンを前面に表示したい. コンポーネントを個別に吊るして、前のレベルよりも大きな値にCanvas
設定することSort Order
がCanvas
できます.普通に前面に表示されます。Sort Order
5. 黒ボタンフローティングハイライト効果
ボタンの上にマウスを置くと、次のようにボタンが強調表示されます。ボタン イメージを黒に設定すると、そのような強調表示効果はあり
ません。状態の色、コンポーネントの色は、最終的なボタンの状態の色の色で乗算されます。色を黒に設定すると、乗算の結果は黒になり、ハイライト効果は表示されません。正しい方法は次のとおりです。 、白、および黒であり、その他の状態の色は特定のニーズに依存します。たとえば、ハイライトは灰色で、最終的な色は次のように設定されます:Image
Image
Button
Button
Button
Image
Image
Image
Button
Normal Color
Hightlighted Color
6. 平文ボタン
このボタンの行は純粋なテキスト ボタンです.
UGUI
作成されるデフォルトのボタンは画像付きです. 少し変更するだけです. メニューからボタンを作成しButton
、コンポーネントを
削除してから、子ノードをコンポーネントに割り当てます.色を設定します.ボタンの各状態について、ノードの幅と高さを直接調整することで応答領域を調整できます〜マウスがテキストに近づくと、次のようにボタンを検出できます。Image
Text
Button
Target Graphic
Button
注: 画像付きのボタンの場合、ボタンの応答領域も拡張したいが、画像自体は拡張したくない場合は、これを使用してボタンの背景画像をコンポーネントの子ノードとして表示することも
技巧
できButton
ます
7.適応スクロールリスト
スクロールリストが使用されますScrollView
.
対処する必要があるのはContent
自己適応です. まず, リストは垂直方向にスライドします.Content
ノードにVerticalLayoutGroup
コンポーネントを掛けます.リストの数に応じ
て高さが増加します.コンポーネントを使用して設定できます.の場合、次に高さを設定し、数が増えるとノードが自動的に高さを拡張するようにします。Content
item
ContentSizeFitter
Vertical Fit
Preferred Size
item
item
Content
8.曲名と動画アイコンの混在配置
単一のリストでは、曲のタイトルとビデオ アイコンが混在し、次のように、ビデオ アイコンが曲のタイトルに追従する必要があり、曲のタイトルのテキストが増加し、ビデオ アイコンが自動的に後方に移動する必要があります。動画アイコンを
曲名テキストの子ノードとして使用し、動画アイコンのアンカーポイントを次のように設定するとmiddle-right
、動画アイコンはテキストボックスの右側を子ノードとして使用します。相対位置を計算するための基準線、
9. ボタンをクリックして写真を切り替えます
ボタンをクリックして、次のようにボタンの画像を切り替えます。ここでは、コードを記述し、
コード内のButton
コンポーネントImage
のオブジェクトを置き換える必要がありますSprite
。たとえば、次のようになります。
playBtn.onClick.AddListener(() =>
{
if (!audioSource.isPlaying)
{
audioSource.Play();
playBtn.image.sprite = pauseSprite;
}
else
{
audioSource.Pause();
playBtn.image.sprite = playSprite;
}
});
10.プログレスバー
プログレスバーはSlider
コンポーネントを使用し、
解決する必要があるのは、プログレスバーが非常に細い場合、プログレスバーの操作領域を拡大することです. 解決策は、コンポーネントを追加し、透明度を に設定しSlider
、Image
高0
さを少し大きめに
調整することです.Slider
値を
調整し、Background
合計を調整して薄くします。同様に、と を調整して薄くすることで、プログレス バーを非常に薄くすることができますが、動作領域は保証されます。Top
Bottom
Fill Area
Top
Bottom
4.コードを書く
1.曲の再生と一時停止
Unity
音を鳴らして聞くには、デフォルトでカメラにぶら下がっているAudioSource
(スピーカーに相当する)コンポーネントとAudioListener
(耳に相当する)
コンポーネントの 2 つが必要です。複数のカメラがある場合は、AudioListener
そのシーンにはアクティブな状態が 1 つしかありませんAudioListener
。それ以外の場合は、エラーが報告されます。
AudioSource
特定のサウンド ファイルを設定するには、メンバーを割り当てる必要があります.次のように、メンバーAudioClip
にサウンド ファイルを直接ドラッグ アンド ドロップできます:コードで動的に設定することもできます:AudioSource
AudioClip
// AudioClip audioClip = TODO 动态加载AudioClip文件;
audioSource.clip = audioClip;
リソース ファイルの動的読み込み 前回の記事で3 つの主要なメソッドについて説明しました. 興味のある方は読んでみてください
. 再生を一時停止するには, AudioSource
sumPlay
メソッドを呼び出すだけですPause
.
// (继续)播放
audioSource.Play();
// 暂停
audioSource.Pause();
2. 音のスペクトル効果
サウンドの再生中にスペクトル効果をリアルタイムで表示することができます.ここで使用されるインターフェイスは、サウンド スペクトル データブロックをサンプリングできます
。AudioSource
GetSpectrumData
public static void GetSpectrumData(float[] samples,
int channel,
FFTWindow window);
パラメータの説明:
samples
: 関数の戻り値。オーディオ サンプル データをsamples
配列に転送します。配列のサイズは2的n次方
min 64
、 maxでなければなりません8192
。
channel
: チャネル、通常は に設定します0
。
window
: 信号の変換に使用されるウィンドウ関数. アルゴリズムが複雑になるほど、音は柔らかくなりますが、速度は遅くなります.
使用法:
最初に浮動小数点配列を宣言します。
public float[] samples = new float[512];
次に、Update
メソッド内でメソッドを使用します。
audiosource.GetSpectrumData(samples, 0, FFTWindow.BlackmanHarris);
次のように、ここにスクリプトをカプセル化しました。
using UnityEngine;
/// <summary>
/// 声音特效
/// </summary>
public class AudioEffect : MonoBehaviour
{
// 用于显示的方块
public GameObject cubeObj;
// 方块的其实点
public Transform startPoint;
// 采样数据长度
private const int SPECTRUM_CNT = 512;
// 采样数据
private float[] spectrumData = new float[SPECTRUM_CNT];
// 方块Transform数组
private Transform[] cubeTransforms = new Transform[SPECTRUM_CNT];
void Start()
{
//cube生成与排列
Vector3 p = startPoint.position;
for (int i = 0; i < SPECTRUM_CNT; i++)
{
p = new Vector3(p.x + 0.11f, p.y, p.z);
GameObject cube = Instantiate(cubeObj, p, cubeObj.transform.rotation);
cube.transform.parent = startPoint;
cubeTransforms[i] = cube.transform;
}
}
/// <summary>
/// 当前帧频率波功率,传到对应cube的localScale
/// </summary>
public void UpdateEffect(AudioSource audioSource)
{
audioSource.GetSpectrumData(spectrumData, 0, FFTWindow.BlackmanHarris);
float scaleY;
for (int i = 0; i < SPECTRUM_CNT; i++)
{
scaleY = Mathf.Lerp(cubeTransforms[i].localScale.y, spectrumData[i] * 10000f, 0.5f);
// 限制一下功率
if (scaleY > 400)
{
scaleY -= 400;
}
else if (scaleY > 300)
{
scaleY -= 300;
}
else if (scaleY > 200)
{
scaleY -= 200;
}
else if (scaleY > 100)
{
scaleY -= 100;
}
cubeTransforms[i].localScale = new Vector3(0.15f, scaleY, 0.15f);
}
}
}
その中にcubeObj
表示用の小さなボックスがあるので、以下のようにプリセットボックスを作りましょう:
シェーダーを使用しshader
、Unlit/Texture
マップは上が白で下が黒のグラデーションカラーです
。UI
インターフェースであり、UI
レイヤーに散在しています。ここでRenderTexture
解決に使用します。
最初に を作成しRenderTexture
、
次に独立したカメラを作成しEffectCamera
(AudioListener
コンポーネントを削除することを忘れないでください)、レイヤーCulling Mask
のみを確認し、メイン カメラを削除することを忘れないで、特殊効果を に設定します。このようにして、特殊効果はカメラ、次のようにJust dragged to camera を配置し、次にスクリプトをノードにハングさせ、次のようにメンバーオブジェクトを割り当てて、次のように特殊効果がレンダリングされるようにします。それを表示して、調整する色を調整できます特殊効果の色は次のとおりです。Water
Water
Layer
Water
EffectCamera
RenderTexture
EffectCamera
Target Texture
audioEffect
AudioEffect
RenderTexture
RawImage
RawImage
4. サウンドの合計継続時間を取得する
var len = audioSource.clip.length;
5.現在のタイムスタンプを設定する
プログレスバーの進行状況に応じて現在のタイムスタンプを設定します
slider.onValueChanged.AddListener((v) =>
{
if (v < 1)
audioSource.time = v * audioSource.clip.length;
});
6.exeを放してタイトルバーを非表示にします
公開後exe
、デフォルトのタイトルバーは実行時に自動的に非表示になる
関連記事を以前書いたことがあります「UnityがPCプラットフォームexe用のウィンドウパターンをリリース (Windows API、閉じるイベントをキャプチャ、ウィンドウのタイトルバーを非表示、最小化を非表示、閉じるボタンを最大化、など)」 .)" は
、次のようにいくつか使用されますWindows API
。
[DllImport("user32.dll")]
public static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")]
public static extern long GetWindowLong(IntPtr hwd, int nIndex);
[DllImport("user32.dll")]
public static extern void SetWindowLong(IntPtr hwd, int nIndex, long dwNewLong);
[DllImport("user32.dll")]
public static extern bool ShowWindow(IntPtr hwd, int cmdShow);
タイトル バーを非表示:
#if UNITY_STANDALONE && !UNITY_EDITOR
/// <summary>
/// 窗口风格
/// </summary>
const int GWL_STYLE = -16;
/// <summary>
/// 标题栏
/// </summary>
const int WS_CAPTION = 0x00c00000;
// 隐藏标题栏
var hwd = GetForegroundWindow();
var wl = GetWindowLong(hwd, GWL_STYLE);
wl &= ~WS_CAPTION;
SetWindowLong(hwd, GWL_STYLE, wl);
#endif
さらに、
ウィンドウを最小化するには、これら 3 つのボタンのロジックを実装する必要があります。
#if UNITY_STANDALONE && !UNITY_EDITOR
/// <summary>
/// 最小化
/// </summary>
const int SW_SHOWMINIMIZED = 2;
// 获得窗口句柄
var hwd = GetForegroundWindow();
// 设置窗口最小化
ShowWindow(hwd, SW_SHOWMINIMIZED);
#endif
ウィンドウを最大化します。
#if UNITY_STANDALONE && !UNITY_EDITOR
/// <summary>
/// 最大化
/// </summary>
const int SW_SHOWMAXIMIZED = 3;
// 获得窗口句柄
var hwd = GetForegroundWindow();
// 设置窗口最小化
ShowWindow(hwd, SW_SHOWMAXIMIZED);
#endif
アプリをオフにする:
Application.Quit();
5. プロジェクトのソースコード
この記事のプロジェクト ソース コードをアップロードしましたCODE CHINA
. 興味のある学生はダウンロードして自分で学ぶことができます.
アドレス: https://codechina.csdn.net/linxinfa/UnityMusicPlayer
注: 私が使用しているバージョンはUnity
ですUnity 2020.1.14f1c1 (64-bit)
,
暖かいリマインダー: このプロジェクトは学習目的での使用のみ、商業目的での使用は禁止されています。
六、完成
最後に浜崎あゆみの歌詞をつけますMY ALL
初めて知った時は歌詞の意味が分からなかったのですが、聴いたらもう歌の中に入っています!
何回
一緒に旅をしてきたか
どれだけ旅
をしてきたか
これまでに残した
もの 完璧じゃないけれど 輝かしいものもあった
今ここにあるクリスタルは
誇りを持って輝いている
私はいつもとても幸せで幸せだった
率直に言えば、そうじゃない
だけど私達は決して
一人にはならない
あなたの夢がどこにあるのか見てほしい
終わりも死もない
本当はその夢を見たい
それが私が望むこと
ずっとあなたのそばにいたい
No何があっても
全力で
君を守ってき
た 悔いはなかった
今なら言える 僕ら
はいつも
最後まで戦ってきた忘れ
られない夜に
君のことを思うことが多いだけど二
人
きりじゃない
君の笑顔を見ていると
恋に落ちて眩しいよ
あの笑顔がまた見たい
から今日も生きてる
君の愛を感じる
力強くて温かい
そんなfree love
全力で感じる
夢の在り処を見てほしい
終わりも死もない
本当はその夢を見てほしい
それが僕の願いだよ
君のそばにいたい
どんなことがあっても
僕の全てで
君を守るよ
よし、ここでやめよう。もう一度イビアン シリーズを聞くよ〜
私はリン シンファです: https://blog.csdn.net/linxinfa
オリジナルであることは簡単ではありません。 、皆さんありがとうございます〜
私が好きです 技術的な質問がある場合は、メッセージまたはプライベートメッセージを残してください。また次回お会いしましょう〜