Unity教程|手把手教你實現「美女與野獸」特效(下)

2021-01-14 Unity官方平臺

using System.Collections;

using System.Collections.Generic;

using UnityEngine;


public class Summoner : MonoBehaviour

{

    public GameObject Beauty;

    public GameObject Beast;

    public GameObject VFX;


    private Texture2D pointCache;

    private float size;


    private bool summonning;


    void Start()

    {

        this.summonning = false;

        this.Beast.transform.position = this.Beauty.transform.position;

        this.Beast.transform.rotation = this.Beauty.transform.rotation;

        this.Beast.SetActive(false);

    }


    void Update()

    {

        if(!this.summonning && Input.GetKeyDown(KeyCode.Space) == true)

        {

            StartCoroutine(Summon());

        }

    }


    private IEnumerator Summon()

    {

        this.summonning = true;

        float minClippingLevel = 0;

        float maxClippingLevel = 2;

        float clippingLevel = maxClippingLevel;

        this.Beauty.SetActive(true);

        while (clippingLevel > minClippingLevel)

        {

            this.UpdateSize(this.Beauty);

            this.UpdateCachePoint(this.Beauty);

            clippingLevel -= Mathf.Abs(maxClippingLevel - minClippingLevel) / 2 * Time.deltaTime;

            SkinnedMeshRenderer[] renderers = this.Beauty.GetComponentsInChildren<SkinnedMeshRenderer>();

            foreach (SkinnedMeshRenderer renderer in renderers)

            {

                foreach (Material material in renderer.materials)

                {

                    material.SetFloat("_ClippingLevel", clippingLevel);

                }

            }

            yield return 0;

        }

        this.Beauty.SetActive(false);

        yield return new WaitForSeconds(1);

        minClippingLevel = 0;

        maxClippingLevel = 3;

        this.Beast.SetActive(true);

        while (clippingLevel < maxClippingLevel)

        {

            this.UpdateSize(this.Beast);

            this.UpdateCachePoint(this.Beast);

            clippingLevel += Mathf.Abs(maxClippingLevel - minClippingLevel) / 2 * Time.deltaTime;

            SkinnedMeshRenderer[] renderers = this.Beast.GetComponentsInChildren<SkinnedMeshRenderer>();

            foreach (SkinnedMeshRenderer renderer in renderers)

            {

                foreach (Material material in renderer.materials)

                {

                    material.SetFloat("_ClippingLevel", clippingLevel);

                }

            }

            yield return 0;

        }

        yield return new WaitForSeconds(1);

        this.summonning = false;

    }


    void UpdateSize(GameObject character)

    {

        SkinnedMeshRenderer[] renderers = character.GetComponentsInChildren<SkinnedMeshRenderer>();

        Bounds bound = new Bounds();

        foreach(SkinnedMeshRenderer renderer in renderers)

        {

            Mesh baked = new Mesh();

            renderer.BakeMesh(baked);

            bound.Encapsulate(baked.bounds);

        }

        this.size = Mathf.Max(bound.extents.x * 2, bound.extents.y * 2, bound.extents.z * 2);

    }


    void UpdateCachePoint(GameObject character)

    {

        Mesh baked;

        Vector3[] vertices;

        Transform parent;

        SkinnedMeshRenderer[] renderers = character.GetComponentsInChildren<SkinnedMeshRenderer>();

        List<Color> normalizedVertices = new List<Color>();

        foreach (SkinnedMeshRenderer renderer in renderers)

        {

            parent = renderer.gameObject.transform.parent;

            baked = new Mesh();

            renderer.BakeMesh(baked);

            vertices = baked.vertices;

            for (int i = 0; i < vertices.Length; i++)

            {

                vertices[i] = (character.gameObject.transform.InverseTransformPoint(renderer.gameObject.transform.TransformPoint(vertices[i])) + new Vector3(size * 0.5f, 0, size * 0.5f)) / size;

                normalizedVertices.Add(new Color(vertices[i].x, vertices[i].y, vertices[i].z));

            }

        }

        if(this.pointCache == null || this.pointCache.width != normalizedVertices.Count)

        {

            this.pointCache = new Texture2D(1, normalizedVertices.Count, TextureFormat.RGBA32, false, true);

            this.pointCache.filterMode = FilterMode.Point;

        }

        this.pointCache.SetPixels(normalizedVertices.ToArray());

        this.pointCache.Apply();

    }

}

相關焦點

  • 我的***煙花炮竹圖文教程 手把手教你煙花炮竹怎麼做
    :原標題:我的****煙花炮竹圖文教程 手把手教你煙花炮竹怎麼做 除夕時我們都會用炮竹驅趕年魔,也叫夕,那麼如果想在我的****中建造一個煙花炮竹應該怎麼做呢?想必各位玩家對此存在許多疑惑,接下來我們一起來跟隨諸葛教科書看看我的****煙花炮竹教程吧。
  • 《企鵝電競》直播圖文教程 手把手教你怎麼開通企鵝電競直播
    《企鵝電競》直播圖文教程 手把手教你怎麼開通企鵝電競直播時間:2020-06-24 18:49   來源:咖綠茵   責任編輯:沫朵 川北在線核心提示:原標題:《企鵝電競》直播圖文教程 手把手教你怎麼開通企鵝電競直播 企鵝電競怎麼直播呢,玩騰訊遊戲的人一般都愛看企鵝電競上面的直播,不少網友想知道該怎麼開直播,接下來就讓咖綠茵小編給大家帶來
  • adobe after effects插件怎麼安裝 手把手教你ae插件怎麼安裝
    adobe after effects插件怎麼安裝 手把手教你ae插件怎麼安裝時間:2017-07-17 15:09   來源:系統天堂   責任編輯:沫朵 川北在線核心提示:原標題:adobe after effects插件怎麼安裝 手把手教你ae插件怎麼安裝 adobe after effects插件怎麼安裝
  • PPT教程:手把手教你高逼格的PPT動畫
    原標題:PPT教程:手把手教你高逼格的PPT動畫 今天河南中公優就業IT培訓小編給大家分享的是一個比賽用的PPT,為了說明水浮蓮(水葫蘆)對水域的汙染十分嚴重,其中一頁PPT裡展示了一組數據
  • 遊戲粒子碰撞魔法特效Unity遊戲素材資源
    分享最新的CG教程與素材資訊!
  • 手把手教你用PyTorch實現圖像分類器(第一部分)
    通過3篇短文,介紹如何實現圖像分類器的概念基礎——這是一種能夠理解圖像內容的算法。本文的目標不是提供手把手的指導,而是幫助理解整個過程。如果你正在考慮學習機器學習或人工智慧,你將不得不做類似的項目,並理解本系列文章中介紹的概念。文章主要進行概念上的解釋,不需要知道如何編寫代碼。
  • 28組炫酷多彩遊戲粒子碰撞爆炸特效Unity遊戲素材資源
    分享最新的CG教程與素材資訊!
  • SketchAR用AR技術「手把手」教你成為優秀的畫家
    文章相關引用及參考:映維網這個工具旨在令你成為一名更優秀的藝術家(無論你的水平如何)(映維網 2018年03月03日)某些人天生就是畫家,但如果你像我一樣完全缺乏畫畫的天賦,不妨嘗試一下這款基於這個工具旨在令你成為一名更優秀的藝術家(無論你的水平如何)。應用的原理相當簡單:在紙片,牆壁或熟睡的朋友臉上畫上幾個加號,然後把智慧型手機攝像頭對準它們。然後,你可以循環逐點學習,系統將指導你如何將自由空間與繪圖的下一層相關聯。這非常直觀,覆蓋層讓人感覺你是在素描圖紙上創作,當然,工具是增強現實。
  • 使用Unity 粒子系統實現 2D 人物足跡效果
    前言 項目中使用的基本角色控制腳本是由 Unity Learn 中的官方教程 John Lemon's Haunted Jaunt(很不錯的教程
  • 手把手教你製作喇叭天線-圖文超詳細教程
    打開APP 手把手教你製作喇叭天線-圖文超詳細教程 工程師2 發表於 2018-05-12 10:35:00
  • 金剛大戰霸王龍,美女與野獸這部電影全佔了
    想必很多人都看過這部片子,這部05年上映的電影,特效技術可以說是爐火純青了,至今也國內也基本上做不出來這樣的效果。幾乎可以以假亂真的金剛,最後在帝國大廈它和女主對視,對視的那一段簡直美翻天了。這裡不得不說的就是做這部電影特效的公司了——維塔數碼。大家可能對這個公司不太熟悉,但是提到《魔戒》想必大家再熟悉不過了,魔戒三部曲可是真正的魔幻史詩,而這部《金剛》和《魔戒》就是維塔數碼公司製作的特效。而電影中的紐約市基本上全是電腦CG製作的,從建築風格到門框再至材質和裝飾顏色全都一絲不苟,整座城市耗時一年才全部完成。
  • 手把手教你怎麼放伴奏錄歌
    手把手教你怎麼放伴奏錄歌時間:2018-08-15 16:43   來源:今日頭條   責任編輯:沫朵 川北在線核心提示:原標題:抖音怎麼放伴奏錄歌? 手把手教你怎麼放伴奏錄歌 抖音怎麼放伴奏錄歌?在抖音上可以看到很多抖友錄唱歌的視頻,如果只是清唱,給人的感覺特別單一,那麼我們要怎麼放伴奏錄歌,並錄出高音質呢,一起來看看吧!
  • 手把手教你製作一個帶特效的全景作品
    那麼,這篇文章就教大家做一個自帶特效的全景圖。1. 準備一個2:1的全景圖片。2. 找一個全景製作工具(網站或者是軟體)。3. 打開網站或者是軟體,發布全景圖片,發布和生成需要時間,大家耐心等待一下。上傳記得填寫項目標題、項目標籤、描述等等。
  • 原來《美女與野獸》的故事竟然是這樣演變的!
    沒錯,這部童話就是《美女與野獸》。2015年上映的《灰姑娘》似乎使古老的童話故事重新煥發活力,也讓嗅覺一向靈敏的迪士尼尋到了金礦。《奇幻森林》、《小美人魚》等紛至沓來,不妨讓我們由此回顧《美女與野獸》的IP演變進程。
  • 野獸兇猛,美女撩人,10部「猛獸」電影沁人心脾
    它們讓你恐懼讓你憐,讓你喜歡也讓你害怕。河馬哥寫過許多期的電影盤點,這一期,這些「野獸」們必須擁有姓名。在那個科技、特效遠不如現在的年代裡,《異形》達到了我們現在都難以企及的高度。第一部中,異形出現的畫面其實並不多。但導演就是有能力讓你被緊張的氣氛所包圍,全身心的跟著劇情走。
  • 拒絕五毛錢特效,帶你揭開電影特效內幕
    《阿麗塔:戰鬥天使》中使用的動作捕捉技術 《美女與野獸》中野獸的「真面目」 無縫銜接
  • 《美女與野獸》主創再回應同性角色爭議 「就像野獸一樣,他們沒有...
    由比爾·康頓執導的真人版《美女與野獸》將於本月進行公映,電影中沿用了原版的所有歌曲。影片講述了年輕姑娘貝兒(艾瑪·沃森 飾)的故事。Mtime:《美女與野獸》可以說是愛情片,但我看到電影院裡有很多小男孩也看得很開心。你們小時候看過哪些關於愛情的電影或電視劇?你們最喜歡那種電影呢?
  • 《美女與野獸》獨家探班&主創專訪 女主原型是凱薩琳赫本 電影嚴謹...
    這棟小屋就是童話故事《美女與野獸》中的美女,女主人公貝兒的家。  真正的骨灰粉可能會認出來這座小鎮的名字;這是對法國小說家加布裡埃爾-蘇珊·巴爾博特·德·維倫紐夫的致敬,正是他在1740年發表了最著名的一版《美女與野獸》。它從最原始時被人們口口相傳,經過一代又一代的傳承,終於落筆到紙上。
  • 手把手教你把國服英雄聯盟配音修改為英文版
    手把手教你把國服英雄聯盟配音修改為英文版 發布時間:2011-05-25 14:01 來源:178 作者:真·冰芒
  • 版本眾多的《美女與野獸》故事為何永遠無法成為女權主義表達
    在螞蟻和雄鷹的幫助下,普塞克完成了前兩項挑戰,但在即將完成第三項挑戰時卻再次為好奇心所累,打開了從冥界帶回的美麗盒子陷入無盡的睡眠之中。丘比特喚醒了沉睡的普賽克,帶她來到奧林匹斯山,接受諸神的祝福,普塞克飲下神酒,飛升成神,與丘比特幸福地生活在了一起。