public void LockUnlock()
    {
        Vector3 modelOrigin1 = model.transform.position;
        Vector3 modelOrigin2 = modelOrigin1 + new Vector3(0, 1, 0);
        Vector3 boxCenter    = modelOrigin2 + model.transform.forward * 5.0f;

        Collider[] cols = Physics.OverlapBox(boxCenter, new Vector3(3.5f, 0.5f, 5f), model.transform.rotation, LayerMask.GetMask("Enemy"));


        if (cols.Length == 0)
        {
            lockTarget      = null;
            lockDot.enabled = false;
            lockStat        = false;
        }
        else
        {
            foreach (var col in cols)
            {
                if (lockTarget != null && lockTarget.obj == col.gameObject)
                {
                    lockTarget      = null;
                    lockDot.enabled = false;
                    lockStat        = false;
                    break;
                }
                lockTarget      = new LockTarget(col.gameObject, col.bounds.extents.y);
                lockDot.enabled = true;
                lockStat        = true;
                break;
            }
        }
    }
Example #2
0
        /// <summary>相机旋转(处于锁定状态时)</summary>
        private void CameraRotate_Locked()
        {
            var tempForward = lockTarget.go.transform.forward - model.transform.position;

            tempForward.y = 0;
            //锁定时调整方向
            model.transform.forward            = tempForward;
            cameraRotation_Y.transform.forward = tempForward;

            //锁定时看向合适的位置(大约以锁定目标处的地面为中心)
            cameraRotation_X.transform.LookAt(lockTarget.go.transform);

            //TODO:定位锁定图标,并且考虑模型遮挡。
            var pos = lockTarget.go.transform.position + new Vector3(0, lockTarget.halfHeight, 0);

            _LockIcon.rectTransform.position = mainCamera.WorldToScreenPoint(pos);

            //当距离过远时解除锁定
            float distance = Vector3.Distance(model.transform.position, lockTarget.go.transform.position);

            if (distance > MaxLockDistance)
            {
                lockTarget        = null;
                _LockIcon.enabled = false;
            }
        }
Example #3
0
    public void LockUnLock()
    {
        Vector3 modelOrigin1 = model.transform.position;
        Vector3 modelOrigin2 = modelOrigin1 + new Vector3(0, 1, 0);
        Vector3 boxCenter    = modelOrigin2 + model.transform.forward * 5.0f;

        Collider[] cols = Physics.OverlapBox(boxCenter, new Vector3(0.5f, 0.5f, 5f), model.transform.rotation, LayerMask.GetMask(isAI ? "Player" : "Enemy"));
        if (cols.Length == 0)
        {
            LockProcessA(null, false, false, isAI);
        }
        else
        {
            foreach (var col in cols)
            {
                if (lockTarget != null && lockTarget.obj == col.gameObject)
                {
                    LockProcessA(null, false, false, isAI);
                    break;
                }

                lockTarget = new LockTarget(col.gameObject, col.bounds.extents.y);
                LockProcessA(lockTarget, true, true, isAI);
                break;
            }
        }
    }
Example #4
0
 public void ChangeEnemys(float button)
 {
     if (SortlockTargets.Count <= 0)
     {
         LockUnLock();
         return;
     }
     if (button == 1)
     {
         targetNum++;
     }
     else if (button == -1)
     {
         targetNum--;
     }
     if (targetNum == SortlockTargets.Count)
     {
         targetNum = 0;
     }
     if (targetNum < 0)
     {
         targetNum = SortlockTargets.Count - 1;
     }
     lockTarget = SortlockTargets[targetNum];
 }
Example #5
0
        /// <summary>切换锁定</summary>
        public void ToggleLock()
        {
            var modelOrigin1 = model.transform.position;
            var modelOrigin2 = modelOrigin1 + new Vector3(0, 1, 0);
            var boxCenter    = modelOrigin2 + model.transform.forward * 5.0f;
            //从某一点,构建某个物体,指定某个层级,返回该层级中在这个物体中的碰撞体数组
            var cols = Physics.OverlapBox(boxCenter, new Vector3(0.5f, 0.5f, 5f), model.transform.rotation, LayerMask.GetMask(Layer.Enemy.TS()));

            //TODO:如何较完美地切换锁定的敌人?
            if (cols.Length == 0)
            {
                lockTarget        = null;
                _LockIcon.enabled = false;
            }
            //如果有可以锁定的对象,则得到首先锁定的敌人
            else
            {
                foreach (var col in cols)
                {
                    if (lockTarget != null && lockTarget.go == col.gameObject)
                    {
                        lockTarget        = null;
                        _LockIcon.enabled = false;
                        break;
                    }
                    lockTarget = new LockTarget(col.gameObject);
                    //启用并定位锁定图标
                    _LockIcon.enabled = true;
                    var pos = lockTarget.go.transform.position;
                    _LockIcon.transform.position = new Vector3(pos.x, pos.y, 0);
                    break;
                }
            }
        }
Example #6
0
 private void LockProcessB(LockTarget _lockTarget, bool _lockDotEnable, bool _lockState, bool _isAI)
 {
     if (isAI)
     {
         lockTarget  = _lockTarget;
         lockStateAI = _lockState;
     }
 }
Example #7
0
 public override void destroy()
 {
     type_ = Type.None;
     enumerator_ = null;
     lock_target_.destroy();
     lock_target_ = null;
     MyCollider.destroyEnemy(collider_);
     base.destroy();
 }
Example #8
0
 private void LockProcessA(LockTarget _lockTarget, bool _lockDotEnable, bool _lockState, bool _isAI)
 {
     lockTarget = _lockTarget;
     if (!_isAI)
     {
         lockDot.enabled = _lockDotEnable;
     }
     lockState = _lockState;
 }
Example #9
0
 private void LockProcessA(LockTarget lockTarget, bool lockDotEnabled, bool lockState, bool isAI)
 {
     this.lockTarget = lockTarget;
     this.lockState  = lockState;
     if (!isAI)
     {
         this.lockDot.enabled = lockDotEnabled;
     }
 }
Example #10
0
    public void LockOff()
    {
        //退出时保持视角
        xMove = transform.rotation.eulerAngles.y;
        yMove = transform.rotation.eulerAngles.x;

        //取消锁定
        lockOnTarget    = null;
        cameraStatus    = CameraStatus.FOLLOW;
        lockDot.enabled = false;
    }
    //解锁
    void OnLock(LockTarget _lockTarget, bool _lockico, bool _lockstate, bool _isAi)
    {
        lockTarget = _lockTarget;

        if (!_isAi)
        {
            LockIco.enabled = _lockico;
        }

        LockState = _lockstate;
    }
 private void Update()
 {
     if (LockState)
     {
         lockDot.transform.position = Camera.main.WorldToScreenPoint(lockTarget.obj.transform.position + Vector3.up * lockTarget.halfHeight);
         if (Vector3.Distance(lockTarget.obj.transform.position, playerHandle.transform.position) > LockRadius)
         {
             lockTarget = null;
             LockState  = false;
         }
     }
 }
Example #13
0
 public void Update()
 {
     if (lockTarget != null)
     {
         Lockdot.rectTransform.position = Camera.main.WorldToScreenPoint(lockTarget.obj.transform.position + new Vector3(0, lockTarget.halfHeight, 0));
         if (Vector3.Distance(model.transform.position, lockTarget.obj.transform.position) > 10.0f)
         {
             lockTarget      = null;
             Lockdot.enabled = false;
             LockState       = false;
         }
     }
 }
Example #14
0
 public void Update()
 {
     if (lockTarget != null)
     {
         lockDot.rectTransform.position = Camera.main.WorldToScreenPoint(lockTarget.obj.transform.position);
         if (Vector3.Distance(model.transform.position, lockTarget.obj.transform.position) > 10.0f) //release lockMode when distance over 10
         {
             lockTarget      = null;
             lockDot.enabled = false;
             lockStat        = false;
         }
     }
 }
Example #15
0
 public static Missile create(ref Vector3 position, ref Quaternion rotation, LockTarget lock_target)
 {
     int cnt = 0;
     while (pool_[pool_index_].alive_) {
     ++pool_index_;
     if (pool_index_ >= POOL_MAX)
         pool_index_ = 0;
     ++cnt;
     if (cnt >= POOL_MAX) {
         Debug.LogError("EXCEED Missile POOL!");
         break;
     }
     }
     var obj = pool_[pool_index_];
     obj.init(ref position, ref rotation, lock_target);
     return obj;
 }
Example #16
0
        /// <summary>
        /// Create a new cache with a fixed size entry table and @Lock table.
        /// </summary>
        /// <param name="tSize">number of entries in the entry hash table.</param>
        /// <param name="lockCount">
        /// number of entries in the <see cref="LockTarget"/> table. This is the maximum
        /// concurrency rate for creation of new objects through
        /// <see cref="load(PackFile, long)"/> invocations.
        /// </param>
        internal OffsetCache(int tSize, int lockCount)
        {
            if (tSize < 1)
            {
                throw new ArgumentException("tSize must be >= 1");
            }

            if (lockCount < 1)
            {
                throw new ArgumentException("lockCount must be >= 1");
            }

            queue      = new Queue();
            _tableSize = tSize;
            _clock     = new AtomicValue <long>(1);
            _table     = new AtomicReferenceArray <Entry <V> >(_tableSize);
            _locks     = new LockTarget[lockCount];

            for (int i = 0; i < _locks.Length; i++)
            {
                _locks[i] = new LockTarget();
            }

            _evictLock = new AutoResetEvent(true);

            var eb = (int)(_tableSize * .1);

            if (64 < eb)
            {
                eb = 64;
            }
            else if (eb < 4)
            {
                eb = 4;
            }

            if (_tableSize < eb)
            {
                eb = _tableSize;
            }

            _evictBatch = eb;
        }
Example #17
0
    public void LockOnToggle()
    {
        if (lockOnTarget == null)
        {
            Collider[] cols = Physics.OverlapSphere(follow.transform.position, maxLockDistance, whatISEnemy);

            //find the most close target.
            Collider nearestCol      = null;
            float    nearestDistance = float.MaxValue;
            foreach (var obj in cols)
            {
                ActorManager am = obj.gameObject.GetComponent <ActorManager>();
                if (am && am.sm.isDead)
                {
                    continue;
                }
                float dis = Vector3.Distance(obj.gameObject.transform.position, transform.position);
                if (dis < nearestDistance)
                {
                    nearestDistance = dis;
                    nearestCol      = obj;
                    lockOn          = true;
                }
            }

            //change status
            if (nearestCol)
            {
                cameraStatus    = CameraStatus.LOCKON;
                lockOnTarget    = new LockTarget(nearestCol.gameObject.transform, nearestCol.bounds.extents.y);
                lockDot.enabled = true;
            }
            else
            {
                cameraStatus = CameraStatus.FOLLOW;
            }
        }
        else
        {
            LockOff();
        }
    }
    /// <summary>
    /// 查找所有在范围内的敌人
    /// 判断与当前锁定目标的距离是否为最近的,且在right方向的敌人
    ///
    /// </summary>
    /// <param name="dir"></param>
    public void ChangeLock(int dir)
    {
        Collider[] cols     = Physics.OverlapSphere(model.transform.position, LockRadius, layerMask);
        float      minAngle = 120f;
        int        min      = -1;

        for (int i = 0; i < cols.Length; i++)
        {
            if (cols[i].gameObject == lockTarget.obj)
            {
                continue;
            }
            Vector3 targetDir = cols[i].transform.position - playerHandle.transform.position;

            float angle = Vector3.SignedAngle(playerHandle.transform.forward, targetDir, Vector3.up);
            if (angle > 120 || angle < -120 || angle * dir < 0)
            {
                continue;
            }
            angle = Mathf.Abs(angle);
            if (angle < minAngle)
            {
                min      = i;
                minAngle = angle;
            }
            else if (angle == minAngle)
            {
                float dis     = Vector3.Distance(playerHandle.transform.position, cols[min].transform.position);
                float NextDis = targetDir.magnitude;
                if (NextDis < dis)
                {
                    min = i;
                }
            }
        }
        if (min >= 0)
        {
            lockTarget = new LockTarget(cols[min].gameObject, cols[min].bounds.extents.y);
        }
    }
Example #19
0
    public void LockUnLock()
    {
        //try to lock
        if (lockTarget == null)
        {
            Vector3    modelOrigin1 = model.transform.position;
            Vector3    modelOrigin2 = modelOrigin1 + new Vector3(0, 1, 0);
            Vector3    boxCenter    = modelOrigin2 + model.transform.forward * 4.0f;
            Collider[] cols         = Physics.OverlapSphere(boxCenter, 5f, LayerMask.GetMask(isAI?"Player":"Enemy"));
            foreach (var col in cols)
            {
                lockTarget = new LockTarget(col.gameObject, col.bounds.extents.y);
                if (lockTarget.actorManager != null && lockTarget.actorManager.stateManager.isDie)
                {
                    lockTarget = null;
                    continue;
                }
                lockTargets.Add(Vector3.Distance(model.transform.position, col.gameObject.transform.position), lockTarget);
            }

            if (lockTargets.Count != 0)
            {
                lockTargets     = lockTargets.OrderBy(o => o.Key).ToDictionary(o => o.Key, p => p.Value);
                SortlockTargets = lockTargets.Values.ToList <LockTarget>();
                lockTargets.Clear();
                lockTarget = SortlockTargets[targetNum];
                if (!isAI)
                {
                    lockDot.enabled = true;
                }
                lockState = true;
            }
        }
        else
        {
            LockProcessA(null, false, false, isAI);
            SortlockTargets.Clear();
            targetNum = 0;
        }
    }
Example #20
0
    public void LockUnLock()
    {
        Vector3 modelOrigin1 = playerHandle.transform.position;
        Vector3 modelOrigin2 = modelOrigin1 + new Vector3(0, 1, 0);
        Vector3 boxCenter    = modelOrigin2 + playerHandle.transform.forward * 4f;

        Collider[] cols = Physics.OverlapBox(boxCenter, new Vector3(0.5f, 0.5f, 5f), playerHandle.transform.rotation, LayerMask.GetMask(isAI?"Player":"Enemy"));

        if (IUI.lockon & lockTarget != null)/* 自己加的 */
        {
            cols = Physics.OverlapSphere(modelOrigin2, 7f, LayerMask.GetMask(isAI ? "Player" : "Enemy"));
        }

        if (cols.Length == 0)
        {
            LockProccessA(null, false, false, isAI);
        }
        else
        {
            foreach (var col in cols)
            {
                if (lockTarget != null && cols.Length < 2 && col.gameObject == lastEnemyObj)/* 自己加的 */
                {
                    LockProccessA(null, false, false, isAI);
                    break;
                }
                //print(cols.Length);
                //当锁定视角与视觉为同一目标
                //当锁定不为空,敌人数量超过1时,锁定目标将换为视野内另外一个
                else if (lockTarget != null && lockTarget.obj == lastEnemyObj && col.gameObject == lastEnemyObj)
                {
                    continue;                                                      /* 自己加的 */
                }
                lockTarget = new LockTarget(col.gameObject, col.bounds.extents.y); //col.bounds.extent计算collider的xyz半值
                LockProccessA(lockTarget, true, true, isAI);
                lastEnemyObj = lockTarget.obj;
                break;
            }
        }
    }
    public void LockUnlock()
    {
        Collider[] cols = Physics.OverlapSphere(model.transform.position, LockRadius, layerMask);

        if (cols.Length == 0)
        {
            lockTarget = null;
            LockState  = false;
            return;
        }
        Debug.Log("aaaaaa");

        int   min    = -1;
        float mindis = 999;

        for (int i = 0; i < cols.Length; i++)
        {
            if (cols[i].transform.GetChild(0).GetComponent <Renderer>().isVisible == false)//会出bug 如果碰撞体没有渲染组件就会
            {
                continue;
            }
            float dis = Vector3.SqrMagnitude(cols[i].gameObject.transform.position - playerHandle.transform.position);
            if (dis < mindis)
            {
                mindis = dis;
                min    = i;
            }
        }
        if (min == -1 || (lockTarget != null && cols[min].gameObject == lockTarget.obj))
        {
            LockState  = false;
            lockTarget = null;
        }
        else
        {
            LockState  = true;
            lockTarget = new LockTarget(cols[min].gameObject, cols[min].bounds.extents.y);
        }
    }
Example #22
0
 public void Update()
 {
     if (lockTarget != null)
     {
         if (!isAI)
         {
             lockDot.rectTransform.position = Camera.main.WorldToScreenPoint(
                 lockTarget.obj.transform.position + new Vector3(0, lockTarget.halfHeight, 0));
         }
         ActorManager targetAm = lockTarget.obj.GetComponent <ActorManager>();
         if (Vector3.Distance(model.transform.position, lockTarget.obj.transform.position) > 13f ||
             (targetAm != null && targetAm.sm.isDie))
         {
             lockTarget = null;
             lockState  = false;
             if (!isAI)
             {
                 lockDot.enabled = false;
             }
         }
     }
 }
Example #23
0
    void Start()
    {
        cameraHandle = transform.parent.gameObject;
        playerHandle = cameraHandle.transform.parent.gameObject;
        tempEulerX   = 20;
        ActorController ac = playerHandle.GetComponent <ActorController>();

        model = ac.model;
        pi    = ac.pi;

        if (isAI)
        {
            lockTarget = new LockTarget(player);
        }
        else
        {
            camera          = Camera.main.gameObject;
            lockDot.enabled = false;
        }

        lockState          = false;
        executeDot.enabled = false;
        Cursor.lockState   = CursorLockMode.Locked;
    }
Example #24
0
    public void LockUnlock()
    {
        Vector3 modelOrigin1 = model.transform.position;
        Vector3 modelOrigin2 = modelOrigin1 + new Vector3(0, 1, 0);
        Vector3 boxCenter;

        if (!isAI)
        {
            boxCenter = modelOrigin2 + camera.transform.forward * 6f;
        }
        else
        {
            boxCenter = modelOrigin2 + model.transform.forward * 6f;
        }

        Collider[] cols = Physics.OverlapBox(boxCenter, new Vector3(2f, 2f, 6f),
                                             isAI? model.transform.rotation:camera.transform.rotation, LayerMask.GetMask(isAI?"Player":"Enemy"));
        if (cols.Length == 0)
        {
            lockTarget = null;
            lockState  = false;
            pi.locking = false;
            if (!isAI)
            {
                lockDot.enabled = false;
            }
        }
        else
        {
            int   index       = 0;
            float minDistance = Vector3.Distance(model.transform.position, cols[0].transform.position);
            float nowDistance;
            for (int i = 0; i < cols.Length; i++)
            {
                nowDistance = Vector3.Distance(model.transform.position, cols[i].transform.position);
                if (nowDistance < minDistance)
                {
                    minDistance = nowDistance;
                    index       = i;
                }
            }

            if (lockTarget != null)
            {
                lockTarget = null;
                if (!isAI)
                {
                    lockDot.enabled = false;
                }
                lockState  = false;
                pi.locking = false;
            }
            else
            {
                lockTarget = new LockTarget(cols[index].gameObject, cols[index].bounds.extents.y);
                if (!isAI)
                {
                    lockDot.enabled = true;
                }
                lockState  = true;
                pi.locking = true;
            }
        }
    }
 public void UnLock()
 {
     lockTarget = null;
     lockState  = false;
 }
 public void Lock(GameObject target)
 {
     lockTarget = new LockTarget(target);
     lockState  = true;
 }
Example #27
0
        public void init(ref Vector3 position, ref Quaternion rotation, Type type)
        {
            base.init(ref position, ref rotation);
            collider_ = MyCollider.createEnemy();
            MyCollider.initSphereEnemy(collider_, ref position, 1f /* radius */);
            var lock_pos = new Vector3(0, 0, 0);
            lock_target_ = LockTarget.create(this, ref lock_pos);

            type_ = type;
            phase_ = Phase.Alive;
            switch (type_) {
            case Type.None:
                Debug.Assert(false);
                break;

            case Type.Zako:
                /* ここで GC.allocate が発生してしまう */
                enumerator_ = zako_act(); // この瞬間は実行されない
                break;
            }
        }
Example #28
0
 private void init(ref Vector3 position, ref Quaternion rotation, LockTarget lock_target)
 {
     // var rotation = Quaternion.identity;
     base.init(ref position, ref rotation);
     rigidbody_.init();
     rigidbody_.transform_.position_ = position;
     float theta;
     if (MyRandom.Probability(0.5f)) {
     theta = (MyRandom.Range(-1f, 1f) * Mathf.PI*0.125f) * Mathf.Rad2Deg;
     } else {
     theta = (MyRandom.Range(-1f, 1f) * Mathf.PI*0.125f + Mathf.PI) * Mathf.Rad2Deg;
     }
     var rot = Quaternion.Euler(0f, 0f, theta) * rotation;
     var v = rot * new Vector3(20f, 0f, 0f);
     rigidbody_.setVelocity(ref v);
     lock_target_ = lock_target;
     trail_locator_ = new Vector3(0, 0, -1);
     // var col = new Color(0.1f, 1f, 0.5f);
     var pos = rigidbody_.transform_.transformPosition(ref trail_locator_);
     trail_id_ = Trail.Instance.spawn(ref pos,
                                  0.2f /* width */,
                                  Trail.Type.Missile);
     arrival_time_ = MyRandom.Range(1.0f, 1.5f);
     destroy_start_ = 0f;
 }