zoukankan      html  css  js  c++  java
  • 武器系统逻辑代码分析

    public var missile :GameObject;  
    public var noise:int;
    public var Owner:GameObject;
    public var Flash:GameObject;
    public var FlashSize:int = 4;
    public var fireRate = 0.1f;
    private var nextFireTime = 0.0;
    private var timeFlash :int = 0;
    public var SoundGun:AudioClip[];
    public var ForceShoot :int = 0;
    public var NumBullet :int = 0;
    public var targetlockontexture:Texture2D;
    public var targetlockedtexture:Texture2D;
    private var target:GameObject;
    private var locked:boolean;
    public var distanceLock:float = 200;
    public var timetolock:float = 2;
    private var timetolockcount:float = 0;
    public var targettag:String = "Enemy";
    public var aimdirection:float = 0.8f; 
    public var Seeker:boolean;
    
    
    function Start () {
        //初始化时间属性
        nextFireTime = 0.0;
        timetolockcount = Time.time;
    }
    
    function Update () {
      //枪口闪光处理
    if(Flash){ if(timeFlash>0){ timeFlash-=1; }else{ Flash.renderer.enabled = false; if(Flash.light) Flash.light.enabled = false; } } if(Seeker){ //是否追踪目标 if(GameObject.FindGameObjectsWithTag(targettag).Length>0){ var objs:Array = GameObject.FindGameObjectsWithTag(targettag); var distance = int.MaxValue; for(var i=0;i<objs.length;i++){ if(objs[i]){ var dir = (objs[i].transform.position - transform.position).normalized; var direction = Vector3.Dot(dir,transform.forward); //获取目标的方向 if(direction >= aimdirection)//如果目标在范围内 { if(timetolockcount + timetolock < Time.time ){ //判断是否到锁定时间 if(!locked){ //是否可以锁定 var dis = Vector3.Distance(objs[i].transform.position, transform.position); if(distanceLock > dis){ //是否在锁定距离以内 if(distance>dis){ distance = dis; target = objs[i]; } } } } }else{ } } } //超出距离解锁 if(target){ locked = true; var targetdistance = Vector3.Distance(transform.position, target.transform.position); if(targetdistance > distanceLock){ Unlock(); } } } } } function DrawTargetLockon(locktexture:Texture2D,aimtarget:Transform,locked:boolean){ if(locktexture && GameObject.Find("Main Camera")){ var screenPos : Vector3 = GameObject.Find("Main Camera").gameObject.camera.WorldToScreenPoint(aimtarget.transform.position); var distance = Vector3.Distance(transform.position, aimtarget.transform.position); GUI.DrawTexture(new Rect(screenPos.x-32,Screen.height - screenPos.y-32,64,64),locktexture); GUI.Label(new Rect(screenPos.x+40, Screen.height - screenPos.y,200,30),"Target "+ Mathf.Floor(distance)+"m."); }else{ Debug.Log("Can't Find (Main Camera), you can fix here by changing the (Main Camera) to any camera name you have."); } } function OnGUI(){ if(Seeker){ if(locked){ if(target){ DrawTargetLockon(targetlockedtexture,target.transform,true); } } if(GameObject.FindGameObjectsWithTag(targettag).Length>0){ var objs:Array = GameObject.FindGameObjectsWithTag(targettag); for(var i=0;i<objs.length;i++){ if(objs[i]){ var dir = (objs[i].transform.position - transform.position).normalized; var direction = Vector3.Dot(dir,transform.forward); if(direction >= aimdirection) { var dis = Vector3.Distance(objs[i].transform.position, transform.position); if(distanceLock > dis){ DrawTargetLockon(targetlockontexture,objs[i].transform,true); } } } } } } } function Unlock(){ // Disable Target locked = false; timetolockcount = Time.time; target = null; } function Shoot(){ if (Time.time > nextFireTime + fireRate){ nextFireTime = Time.time; if(SoundGun.length>0){ AudioSource.PlayClipAtPoint(SoundGun[Random.Range(0,SoundGun.length)],transform.position); } for(var i=0;i<NumBullet;i++){ var noisGun = Vector3(Random.Range(-noise,noise),Random.Range(-noise,noise),Random.Range(-noise,noise))/200; var direction = transform.TransformDirection(Vector3.forward+noisGun); var rotate:Quaternion = this.transform.rotation; var bullet:GameObject = Instantiate(missile, this.transform.position, rotate); if(bullet.GetComponent(MoverMissile)){ bullet.GetComponent(MoverMissile).target = target; } if(bullet.GetComponent(Damage)){ bullet.GetComponent(Damage).Owner = Owner; } if(bullet.rigidbody){ bullet.rigidbody.AddForce(direction*ForceShoot); } } Unlock(); timeFlash = 1; if(Flash){ Flash.renderer.enabled = true; if(Flash.light) Flash.light.enabled = true; Flash.transform.localScale.x = Random.Range(FlashSize/2,FlashSize)/100.0f; Flash.transform.localScale.y = Flash.transform.localScale.x; Flash.transform.localScale.z = Flash.transform.localScale.x; } nextFireTime += fireRate; } }
  • 相关阅读:
    面板评分太低会算两次
    没有使用大漩涡传送门没有杀死大法师瓦格斯
    win10创建本地用户
    延迟着色
    GPU 优化总结
    UE4 减少APK包的大小
    UE4 性能优化方法(工具篇)
    Unreal Engine 4的常见Tips
    虚幻引擎4设置Visual Studio
    模型导入的单位问题
  • 原文地址:https://www.cnblogs.com/88999660/p/3262810.html
Copyright © 2011-2022 走看看