zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    80年代的兄弟,你会什么?
    设计模式单件模式
    大冒险 这注定是部史诗级的探索。。。
    关于重构JS前端框架的失败经验(顺便怀念那些死去的代码)
    JDBC连接数据库类(主要用于存储过程)
    ActiveRecord学习(六):总结
    ASP.NET中常用的文件上传下载方法
    [整理]ASP.NET2.0新特性概述
    关于NHibernate中one to many 的问题
    关注06德国世界杯:比赛日程表
  • 原文地址:https://www.cnblogs.com/zhaoqingqing/p/3542474.html
Copyright © 2011-2022 走看看