• Unity Sample Bootcamp


    M4枪 射击特效

    Gun.js源码

        function GenerateGraphicStuff(hit : RaycastHit)
        {
            var hitType : HitType;
            
            var body : Rigidbody = hit.collider.rigidbody;
            if(body == null)
            {
                if(hit.collider.transform.parent != null)
                {
                    body = hit.collider.transform.parent.rigidbody;
                }
            }
            
            if(body != null)
            {
                if(body.gameObject.layer != 10 && !body.gameObject.name.ToLower().Contains("door"))
                {
                    body.isKinematic = false;
                }
            
                if(!body.isKinematic)
                {
                        var direction : Vector3 = hit.collider.transform.position - weaponTransformReference.position;
                    body.AddForceAtPosition(direction.normalized * pushPower, hit.point, ForceMode.Impulse);
                }
            }
            
            var go : GameObject;
            
            var delta : float = -0.02;
            var hitUpDir : Vector3 = hit.normal;
            var hitPoint : Vector3 = hit.point + hit.normal * delta;
            
            switch(hit.collider.tag)
            {
                case "wood":
                    hitType = HitType.WOOD;
                    go = GameObject.Instantiate(woodParticle, hitPoint, Quaternion.FromToRotation(Vector3.up, hitUpDir)) as GameObject;
                    break;
                case "metal":
                    hitType = HitType.METAL;
                    go = GameObject.Instantiate(metalParticle, hitPoint, Quaternion.FromToRotation(Vector3.up, hitUpDir)) as GameObject;
                    break;
                case "car":
                    hitType = HitType.METAL;
                    go = GameObject.Instantiate(metalParticle, hitPoint, Quaternion.FromToRotation(Vector3.up, hitUpDir)) as GameObject;
                    break;
                case "concrete":
                    hitType = HitType.CONCRETE;
                    go = GameObject.Instantiate(concreteParticle, hitPoint, Quaternion.FromToRotation(Vector3.up, hitUpDir)) as GameObject;
                    break;
                case "dirt":
                    hitType = HitType.CONCRETE;
                    go = GameObject.Instantiate(sandParticle, hitPoint, Quaternion.FromToRotation(Vector3.up, hitUpDir)) as GameObject;
                    break;
                case "sand":
                    hitType = HitType.CONCRETE;
                    go = GameObject.Instantiate(sandParticle, hitPoint, Quaternion.FromToRotation(Vector3.up, hitUpDir)) as GameObject;
                    break;
                case "water":
                    go = GameObject.Instantiate(waterParticle, hitPoint, Quaternion.FromToRotation(Vector3.up, hitUpDir)) as GameObject;
                    break;
                default:
                    return;
            }
            
            go.layer = hit.collider.gameObject.layer;
            
            if(hit.collider.renderer == null) return;
            
            if(timerToCreateDecal < 0.0 && hit.collider.tag != "water")
            {
                go = GameObject.Instantiate(bulletMark, hit.point, Quaternion.FromToRotation(Vector3.forward, -hit.normal));
                var bm : BulletMarks = go.GetComponent("BulletMarks");
                bm.GenerateDecal(hitType, hit.collider.gameObject);
                timerToCreateDecal = 0.02;
            }
        }

    分析

    根据枪射击到不同的材质,实例化不同的特效

    particle_dirt2particle_dirt

    子弹打到的痕迹

    子弹打在材质上表面留下的痕迹:贴花系统,没怎么看明白,Decal System

    文档资料

    http://game.ceeger.com/Components/shader-NormalDecal.html

    http://docs.unity3d.com/Documentation/ScriptReference/RaycastHit-textureCoord.html

    BulletMarks.js 重点代码

    #pragma strict
    #pragma implicit
    #pragma downcast
    
    enum HitType
    {
        CONCRETE,
        WOOD,
        METAL,
        OLD_METAL,
        GLASS,
        GENERIC
    }
    
    class BulletMarks extends MonoBehaviour
    {
        public var concrete : Texture2D[];
        public var wood : Texture2D[];
        public var metal : Texture2D[];
        public var oldMetal : Texture2D[];
        public var glass : Texture2D[];
        public var generic : Texture2D[];
        
        public function GenerateDecal(type : HitType, go : GameObject) 
        {
            var useTexture : Texture2D;
            var random : int;
            switch(type)
            {
                case HitType.GENERIC:
                    if(generic == null) return;
                    if(generic.Length == 0) return;
                    
                    random = Random.Range(0, generic.Length);
                    
                    useTexture = generic[random];
                    break;
                .......
                default:
                    if(wood == null) return;
                    if(wood.Length == 0) return;
                    
                    random = Random.Range(0, wood.Length);
                    
                    useTexture = wood[random];
                    return;
            }
            
            transform.Rotate(new Vector3(0, 0, Random.Range(-180.0, 180.0)));
    
            Decal.dCount++;
            var d : Decal = gameObject.GetComponent("Decal");
            d.affectedObjects = new GameObject[1];
            d.affectedObjects[0] = go;
            d.decalMode = DecalMode.MESH_COLLIDER;
            d.pushDistance = 0.009 + BulletMarkManager.Add(gameObject);
            var m : Material = new Material(d.decalMaterial);
            m.mainTexture = useTexture;
            d.decalMaterial = m;
            d.CalculateDecal();
            d.transform.parent = go.transform;
        }

     贴图

    imageimage

    imageimage

    imageimage

  • 相关阅读:
    儿子和女儿——解释器和编译器的区别与联系
    求eclipse中的java build path 详解
    求eclipse中的java build path 详解
    System.Activator类
    htmlagilitypack解析html
    KindleEditor insertfile初始化多个
    按住ALT键复制
    隐藏行错误排查
    列类型: 202错误
    C#中的&运算
  • 原文地址:https://www.cnblogs.com/zhaoqingqing/p/3542474.html
Copyright © 2020-2023  润新知