最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Unity-Demo游戲?qū)崿F(xiàn)桌面小寵物

 更新時間:2025年08月16日 15:53:30   作者:呆呆敲代碼的小Y  
看到網(wǎng)上有用Unity做的桌面小寵物,就自己搜了些資料自己做了一個小Demo,有一個腳本跟一個Shader,通過腳本和Shader負責將Unity運行時的背景調(diào)成透明色

看到網(wǎng)上有用Unity做的桌面小寵物,就自己搜了些資料自己做了一個小Demo。

核心功能實現(xiàn)

簡單說一下思路,有一個腳本跟一個Shader,通過腳本和Shader負責將Unity運行時的背景調(diào)成透明色。這個是通過調(diào)顏色來進行了。具體原理也不清楚,查了查資料大概是這樣

  • 窗口透明化與無邊框

    • 通過Windows API調(diào)用SetWindowLongDwmExtendFrameIntoClientArea實現(xiàn)透明背景和隱藏邊框,需在相機設(shè)置中將Clear Flags設(shè)為Solid Color且透明度為01。
    • 注意:背景色需與模型邊緣顏色相近以避免毛邊(如0x00BGR格式的COLORREF值)2。
  • 交互邏輯

    • 點擊穿透‌:通過檢測鼠標坐標與模型碰撞器實現(xiàn)交互(如點擊播放撓癢動畫)15。
    • 拖拽限制‌:動態(tài)計算模型碰撞器與屏幕邊緣距離,使用Mathf.Clamp限制移動范圍2。

代碼部分

shader

Shader "Custom/MakeTransparent" {
  Properties {
    _MainTex ("Base (RGB)", 2D) = "white" {}
    _TransparentColorKey ("Transparent Color Key", Color) = (0,1,0,1)
    _TransparencyMargin ("Transparency Margin", Float) = 0.01 
  }
  SubShader {
    Pass {
      Tags { "RenderType"="Opaque" }
      LOD 200
    
      CGPROGRAM

      #pragma vertex VertexShaderFunction
      #pragma fragment PixelShaderFunction
    
      #include "UnityCG.cginc"

      struct VertexData
      {
        float4 position : POSITION;
        float2 uv : TEXCOORD0;
      };

      struct VertexToPixelData
      {
        float4 position : SV_POSITION;
        float2 uv : TEXCOORD0;
      };

      VertexToPixelData VertexShaderFunction(VertexData input)
      {
        VertexToPixelData output;
        output.position = UnityObjectToClipPos (input.position);
        output.uv = input.uv;
        return output;
      }
    
      sampler2D _MainTex;
      float3 _TransparentColorKey;
      float _TransparencyMargin;

      float4 PixelShaderFunction(VertexToPixelData input) : SV_Target
      {
        float4 color = tex2D(_MainTex, input.uv);
      
        float deltaR = abs(color.r - _TransparentColorKey.r);
        float deltaG = abs(color.g - _TransparentColorKey.g);
        float deltaB = abs(color.b - _TransparentColorKey.b);

        if (deltaR < _TransparencyMargin && deltaG < _TransparencyMargin && deltaB < _TransparencyMargin)
        {
          return float4(0.0f, 0.0f, 0.0f, 0.0f);
        }

        return color;
      }
      ENDCG
    }
  }
}

C#

using System;
using System.Runtime.InteropServices;
using UnityEngine;

public class TransparentWindow : MonoBehaviour
{
    [SerializeField] private Material m_Material;

    private struct MARGINS
    {
        public int cxLeftWidth;
        public int cxRightWidth;
        public int cyTopHeight;
        public int cyBottomHeight;
    }

    [DllImport("user32.dll")]
    private static extern IntPtr GetActiveWindow();

    [DllImport("user32.dll")]
    private static extern int SetWindowLong(IntPtr hWnd, int nIndex, uint dwNewLong);

    [DllImport("Dwmapi.dll")]
    private static extern uint DwmExtendFrameIntoClientArea(IntPtr hWnd, ref MARGINS margins);

    [DllImport("user32.dll", EntryPoint = "SetWindowPos")]
    private static extern int SetWindowPos(IntPtr hwnd, IntPtr hwndInsertAfter, int x, int y, int cx, int cy,
        int uFlags);

    [DllImport("user32.dll")]
    static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);

    [DllImport("user32.dll", EntryPoint = "SetLayeredWindowAttributes")]
    static extern int SetLayeredWindowAttributes(IntPtr hwnd, int crKey, byte bAlpha, int dwFlags);

    [DllImport("User32.dll")]
    private static extern bool SetForegroundWindow(IntPtr hWnd);

    const int GWL_STYLE = -16;
    const int GWL_EXSTYLE = -20;
    const uint WS_POPUP = 0x80000000;
    const uint WS_VISIBLE = 0x10000000;

    const uint WS_EX_TOPMOST = 0x00000008;
    const uint WS_EX_LAYERED = 0x00080000;
    const uint WS_EX_TRANSPARENT = 0x00000020;

    const int SWP_FRAMECHANGED = 0x0020;
    const int SWP_SHOWWINDOW = 0x0040;
    const int LWA_ALPHA = 2;

    private IntPtr HWND_TOPMOST = new IntPtr(-1);

    private IntPtr _hwnd;

    void Start()
    {
#if !UNITY_EDITOR
    MARGINS margins = new MARGINS() { cxLeftWidth = -1 };
    _hwnd = GetActiveWindow();
    int fWidth = Screen.width;
    int fHeight = Screen.height;
        SetWindowLong(_hwnd, GWL_STYLE, WS_POPUP | WS_VISIBLE);
        //SetWindowLong(_hwnd, GWL_EXSTYLE, WS_EX_TOPMOST | WS_EX_LAYERED | WS_EX_TRANSPARENT);//若想鼠標穿透,則將這個注釋恢復即可
        DwmExtendFrameIntoClientArea(_hwnd, ref margins);
        SetWindowPos(_hwnd, HWND_TOPMOST, 0, 0, fWidth, fHeight, SWP_FRAMECHANGED | SWP_SHOWWINDOW); 
        ShowWindowAsync(_hwnd, 3); //Forces window to show in case of unresponsive app    // SW_SHOWMAXIMIZED(3)
#endif
    }

    void OnRenderImage(RenderTexture from, RenderTexture to)
    {
        Graphics.Blit(from, to, m_Material);
    }
}

具體步驟

1.新建一個material(材質(zhì)球),選擇剛建立的Shader:

2.將剛寫的C#腳本掛在攝像機上,攝像機的Clear Flags模式選擇Solod Color,并將剛建立的材質(zhì)球掛在腳本上。

3.攝像機的Background屬性要和材質(zhì)球的Transparent Color Key屬性一致:

4.這里要注意一個點,unity19以上的版本需要設(shè)置一個東西。在playerSetting中將這個UseDXGIFlipModelSwapchainforD3D11取消勾選。

這樣就可以實現(xiàn)窗口透明了,然后在場景里加一個模型跟動作就好啦

總結(jié)

到此這篇關(guān)于Unity-Demo游戲?qū)崿F(xiàn)桌面小寵物的文章就介紹到這了,更多相關(guān)Unity-Demo桌面小寵物內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#編程實現(xiàn)連接SQL SERVER數(shù)據(jù)庫實例詳解

    C#編程實現(xiàn)連接SQL SERVER數(shù)據(jù)庫實例詳解

    這篇文章主要介紹了C#編程實現(xiàn)連接SQL SERVER數(shù)據(jù)庫的方法,以實例形式較為詳細的分析了C#連接SQL SERVER數(shù)據(jù)庫的相關(guān)步驟與具體實現(xiàn)技巧,需要的朋友可以參考下
    2015-11-11
  • 從原理到代碼詳解C#解析Word表格數(shù)據(jù)的最佳實踐指南

    從原理到代碼詳解C#解析Word表格數(shù)據(jù)的最佳實踐指南

    在現(xiàn)代辦公環(huán)境中,Word文檔作為信息交換和存儲的重要載體,其地位舉足輕重,本文將深入探討如何使用C#從Word文檔中精確高效地提取表格數(shù)據(jù),感興趣的小伙伴可以了解下
    2025-11-11
  • C# Fiddler插件實現(xiàn)網(wǎng)站離線瀏覽功能

    C# Fiddler插件實現(xiàn)網(wǎng)站離線瀏覽功能

    本文主要介紹了C# Fiddler插件實現(xiàn)網(wǎng)站離線瀏覽功能的原理與方法。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • 深入了解C#多線程安全

    深入了解C#多線程安全

    使用多線程無法避免的一個問題就是多線程安全。那什么是多線程安全?如何解決多線程安全?本文將通過一些簡單的例子為大家詳細介紹一下多線程相關(guān)的問題,感興趣的可以了解一下
    2021-12-12
  • C#?程序通用結(jié)構(gòu)

    C#?程序通用結(jié)構(gòu)

    這篇文章主要介紹了C#?程序通用結(jié)構(gòu),C#?程序由一個或多個文件組成。?每個文件均包含零個或多個命名空間。?一個命名空間包含類、結(jié)構(gòu)、接口、枚舉、委托等類型或其他命名空間,具體相關(guān)內(nèi)容請需要的小伙伴參考下面文章的詳細內(nèi)容<BR>
    2021-12-12
  • C#常用類庫YamlDotNet詳解

    C#常用類庫YamlDotNet詳解

    YamlDotNet是C#處理YAML數(shù)據(jù)的最優(yōu)選擇,其易用性、靈活性和兼容性,能完美適配配置文件、數(shù)據(jù)交換等各類場景,本文介紹C#常用類庫YamlDotNet詳解,感興趣的朋友跟隨小編一起看看吧
    2026-03-03
  • 使用C#代碼在PDF中創(chuàng)建目錄的方法示例

    使用C#代碼在PDF中創(chuàng)建目錄的方法示例

    目錄在提升文檔的可讀性和可導航性方面起著至關(guān)重要的作用,它為讀者提供了文檔結(jié)構(gòu)的清晰概覽,使他們能夠快速定位并訪問感興趣的特定章節(jié)或信息,本文將介紹如何使用 Spire.PDF for .NET 在 C# 和 VB.NET 中創(chuàng)建 PDF 文檔的目錄,需要的朋友可以參考下
    2025-11-11
  • c#中多線程訪問winform控件的若干問題小結(jié)

    c#中多線程訪問winform控件的若干問題小結(jié)

    大部分情況下都會碰到使用多線程控制界面上控件信息的問題。然而我們并不能用傳統(tǒng)方法來解決這個問題,下面我將詳細的介紹
    2013-10-10
  • C#并發(fā)容器之ConcurrentDictionary與普通Dictionary帶鎖性能詳解

    C#并發(fā)容器之ConcurrentDictionary與普通Dictionary帶鎖性能詳解

    這篇文章主要介紹了C#并發(fā)容器之ConcurrentDictionary與普通Dictionary帶鎖性能詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Unity shader實現(xiàn)頂點動畫波動效果

    Unity shader實現(xiàn)頂點動畫波動效果

    這篇文章主要為大家詳細介紹了Unity shader實現(xiàn)頂點動畫波動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04

最新評論

盐边县| 呼图壁县| 甘谷县| 宣城市| 宁海县| 株洲市| 灵武市| 南涧| 沐川县| 龙海市| 乌拉特中旗| 乐业县| 离岛区| 嘉义市| 富阳市| 长顺县| 长汀县| 额济纳旗| 铁岭市| 渑池县| 黄龙县| 铅山县| 曲水县| 舒兰市| 永春县| 连城县| 栖霞市| 郓城县| 东宁县| 寿光市| 北票市| 塘沽区| 土默特右旗| 含山县| 四川省| 获嘉县| 都匀市| 叶城县| 宜黄县| 双江| 灌南县|