首页 > 其他分享 >【Unity3D】消融特效

【Unity3D】消融特效

时间:2023-10-15 12:55:41浏览次数:38  
标签:Unity3D 特效 newMaterial Material private 消融 void

1 前言

选中物体消融特效中基于 Shader 实现了消融特效,本文将基于 Shader Graph 实现消融特效,两者原理一样,只是表达方式不同,另外,选中物体消融特效中通过 discard 丢弃片元,本文通过 alpha 测试丢弃片元。

​ Shader Graph环境搭建、简单应用详见→Shader Graph简介

​ 本文完整资源见→Unity3D消融特效

2 消融特效实现

​ 创建 Unlit Shader Graph,重命名为 DissolveEffect,编辑如下。

img

​ 其中,Alpha 测试需要在 Graph Settings 中开启,如下。

img

​ 为实现点击消失效果,需要编写脚本如下。

​ DieController.cs

using UnityEngine;
 
public class DieController : MonoBehaviour {
    private RaycastHit hit; // 碰撞信息
 
    private void Start() {
        hit = new RaycastHit();
    }

    private void Update() {
        if (Input.GetMouseButtonUp(0)) {
            GameObject hitObj = GetHitObj();
            if (hitObj != null) {
                GameObject rootObj = GetRootObj(hitObj);
                rootObj.AddComponent<DissolveEffect>();
            }
        }
    }

    private GameObject GetHitObj() { // 获取屏幕射线碰撞的物体
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        if (Physics.Raycast(ray, out hit)) {
            return hit.collider.gameObject;
        }
        return null;
    }

    private GameObject GetRootObj(GameObject obj) { // 获取根对象
        while (obj.transform.parent != null && obj.layer == obj.transform.parent.gameObject.layer) {
            obj = obj.transform.parent.gameObject;
        }
        return obj;
    }
}

​ DissolveEffect.cs

using UnityEngine;
 
[DisallowMultipleComponent] // 不允许在同一对象上挂载多个该组件
public class DissolveEffect : MonoBehaviour {
    private Renderer[] renderers; // 渲染器
    private Material dissolveMat; // 消融材质
    private float burnSpeed = 0.25f; // 燃烧速度
    private float burnAmount = 0; // 燃烧量, 值越大模型镂空的越多
 
    private void Awake() {
        dissolveMat = Resources.Load<Material>("DissolveMat");
        renderers = GetComponentsInChildren<Renderer>();
    }

    private void OnEnable() {
        foreach (Renderer renderer in renderers) {
            Material[] materials = renderer.sharedMaterials;
            Material[] dissolveMaterials = new Material[materials.Length];
            for (int i = 0; i < materials.Length; i++) {
                Material newMaterial = new Material(dissolveMat);
                SetTexture(materials[i], newMaterial);
                SetColor(materials[i], newMaterial);
                newMaterial.SetFloat("_BurnAmount", 0);
                dissolveMaterials[i] = newMaterial;
            }
            renderer.sharedMaterials = dissolveMaterials;
        }
    }

    private void Update() {
        burnAmount += Time.deltaTime * burnSpeed;
        foreach (Renderer renderer in renderers) {
            Material[] materials = renderer.sharedMaterials;
            foreach (Material material in materials) {
                material.SetFloat("_BurnAmount", burnAmount);
            }
        }
        if (burnAmount >= 1f) {
            Destroy(gameObject);
        }
    }

    private void SetTexture(Material oldMaterial, Material newMaterial) { // 设置材质
        if (oldMaterial.HasTexture("_MainTex")) {
            Texture texture = oldMaterial.GetTexture("_MainTex");
            newMaterial.SetTexture("_MainTex", texture);
        }
    }

    private void SetColor(Material oldMaterial, Material newMaterial) { // 设置颜色
        Color color = Color.white;
        if (oldMaterial.HasColor("_Color")) {
            color = oldMaterial.GetColor("_Color");
        }
        newMaterial.SetColor("_Color", color);
    }
}

​ 运行效果如下。

img

​ 声明:本文转自【Unity3D】消融特效

标签:Unity3D,特效,newMaterial,Material,private,消融,void
From: https://www.cnblogs.com/zhyan8/p/17760970.html

相关文章

  • 【Unity3D】Shader Graph简介
    1ShaderGraph简介​ShaderGraph是Unity官方在2018年推出的Shader制作插件,是图形化的Shader制作工具,类似于Blender中的ShaderEditor和UE中的MaterialEditor,它使用流程图的形式表达顶点变换和片元着色的流程,通过节点(Node)的连接实现各种复杂的特效,关于节......
  • AR人脸美颜特效解决方案,打造全方位美颜美妆新时代
    随着科技的不断发展,人们对美的追求也日益增长。在这个看脸的时代,一张完美的脸庞无疑是吸引眼球的最佳法宝。为了满足广大用户对美颜的需求,美摄AR人脸美颜特效解决方案应运而生,凭借其强大的功能,为用户带来全新的美颜美妆体验。一、美颜美妆,打造完美肌肤美摄AR人脸美颜特效解决方案......
  • unity3d-控件 Controls
    ControlTypes控件类型ThereareanumberofdifferentGUIControlsthatyoucancreate.ThissectionlistsalloftheavailabledisplayandinteractiveControls.ThereareotherGUIfunctionsthataffectlayoutofControls,whicharedescribedintheLayout......
  • 视频剪辑中生成花字特效的代码案例详述
    本文为阿里云智能媒体服务IMS「云端智能剪辑」实践指南第四期,通过运用官方提供的花字模版或自定义设计花字,完成丰富、精美的花字特效视频剪辑。昱尘|作者在视频后期剪辑中,“花字”是一种特别的存在。通过使用适合视频的花字,不仅可以丰富视频内容,还可以让视频传达的信息更加容......
  • Arcgis 与 Pixi.js 可视化 glsl 特效篇(二十一)
    这次我们用pixi.js和arcgisjs结合我们先定义一下传入数据结构symbol暂时不做let option={renderer:{type:"simple",symbol:{}},data:[{geometry:[12956152.73135875,4855356.473704897],attributes:{name:"北京"}},{geometry:[12697872.01278319......
  • ScrollView如何裁剪粒子特效
    1)ScrollView如何裁剪粒子特效2)Unreal在移动设备中无法使用Stat命令获取到GPUThread的耗时3)Unity中如何看到相机视野范围内的剔除结果这是第354篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和学习。UWA社区主页:com......
  • unity3d 清空控制台
    unity3d清空控制台usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.UI;usingAssemblyCSharp;usingSystem;#ifUNITY_EDITORusingUnityEditor;#endifpublicclassVCClearConsole:MonoBehaviour{//......
  • Arcgis 与 Pixi.js 可视化 glsl 特效篇(十八)
    这次我们用pixi.js和arcgisjs结合我们先定义一下传入数据结构symbol暂时不做let option={renderer:{type:"simple",symbol:{}},data:[{geometry:[12956152.73135875,4855356.473704897],attributes:{name:"北京"}},{geometry:[12697872.01278319......
  • Arcgis 与 Pixi.js 可视化 glsl 特效篇(十七)
    这次我们用pixi.js和arcgisjs结合我们先定义一下传入数据结构symbol暂时不做let option={renderer:{type:"simple",symbol:{}},data:[{geometry:[12956152.73135875,4855356.473704897],attributes:{name:"北京"}},{geometry:[12697872.0127......
  • Arcgis 与 Pixi.js 可视化 glsl 特效篇(十六)
    这次我们用pixi.js和arcgisjs结合我们先定义一下传入数据结构symbol暂时不做let option={renderer:{type:"simple",symbol:{}},data:[{geometry:[12956152.73135875,4855356.473704897],attributes:{name:"北京"}},{geometry:[12697872.01278319......