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; } } }
/// <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; } }
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; } } }
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]; }
/// <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; } } }
private void LockProcessB(LockTarget _lockTarget, bool _lockDotEnable, bool _lockState, bool _isAI) { if (isAI) { lockTarget = _lockTarget; lockStateAI = _lockState; } }
public override void destroy() { type_ = Type.None; enumerator_ = null; lock_target_.destroy(); lock_target_ = null; MyCollider.destroyEnemy(collider_); base.destroy(); }
private void LockProcessA(LockTarget _lockTarget, bool _lockDotEnable, bool _lockState, bool _isAI) { lockTarget = _lockTarget; if (!_isAI) { lockDot.enabled = _lockDotEnable; } lockState = _lockState; }
private void LockProcessA(LockTarget lockTarget, bool lockDotEnabled, bool lockState, bool isAI) { this.lockTarget = lockTarget; this.lockState = lockState; if (!isAI) { this.lockDot.enabled = lockDotEnabled; } }
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; } } }
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; } } }
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; } } }
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; }
/// <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; }
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); } }
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; } }
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); } }
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; } } } }
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; }
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; }
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; } }
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; }