// Update is called once per frame public virtual void FixedUpdate() { if (!isFireNow) { return; } if (!isFollow) { curveTime += Time.fixedDeltaTime * speed * 10 * magnitude; subDiff = v3Diff * curveSpeed.Evaluate(curveTime); // subDiff.y += high * curveHigh.Evaluate (curveTime); subDiff += highV3 * curveHigh.Evaluate(curveTime); if (!isMulHit && haveCollider) { if (Physics.Raycast(transform.position, v3Diff, out hitInfor, 1f)) { OnTriggerEnter(hitInfor.collider); } } if (needRotate && subDiff.magnitude > 0.001f) { Utl.RotateTowards(transform, origin + subDiff - transform.position); } transform.position = origin + subDiff; if (curveTime >= 1f) { hitTarget = null; onFinishFire(true); } } else { if (target == null || target.isDead || (RefreshTargetMSec > 0 && (DateEx.nowMS - lastResetTargetTime >= RefreshTargetMSec)) ) { lastResetTargetTime = DateEx.nowMS; resetTarget(); } subDiff = CalculateVelocity(transform.position); if (!isMulHit) { if (Physics.Raycast(transform.position, v3Diff, out hitInfor, 1f)) { OnTriggerEnter(hitInfor.collider); } } //Rotate towards targetDirection (filled in by CalculateVelocity) if (targetDirection != Vector3.zero) { Utl.RotateTowards(transform, targetDirection, turningSpeed); } transform.Translate(subDiff.normalized * Time.fixedDeltaTime * speed * 10, Space.World); } }
public virtual void RotateBullet() { if (needRotate) { curveTime2 += Time.fixedDeltaTime * speed * 10 * magnitude; subDiff2 = v3Diff * curveSpeed.Evaluate(curveTime2); // subDiff.y += high * curveHigh.Evaluate (curveTime); subDiff2 += highV3 * curveHigh.Evaluate(curveTime2); if (subDiff2.magnitude > 0.01) { Utl.RotateTowards(transform, origin + subDiff2 - transform.position); } } }
public virtual void doFire(CLUnit attacker, CLUnit target, Vector3 orgPos, Vector3 dir, object attr, object data, object callbak) { this.attr = attr; this.data = data; this.attacker = attacker; this.target = target; onFinishCallback = callbak; int SpeedRandomFactor = MapEx.getBytes2Int(attr, "SpeedRandomFactor"); // int SpeedRandomFactor = NumEx.bio2Int (MapEx.getBytes (attr, "SpeedRandomFactor")); speed = MapEx.getBytes2Int(attr, "Speed") / 10.0f; // speed = (NumEx.bio2Int (MapEx.getBytes (attr, "Speed"))) / 10.0f; if (SpeedRandomFactor > 0) { speed = speed + attacker.fakeRandom(-SpeedRandomFactor, SpeedRandomFactor) / 100.0f; } high = MapEx.getBytes2Int(attr, "High") / 10.0f; // high = NumEx.bio2Int (MapEx.getBytes (attr, "High")); if (MapEx.getBool(attr, "IsHighOffset")) { high = high * (1.0f + attacker.fakeRandom(-200, 200) / 1000.0f); } bool isZeroY = high > 0 ? true : false; float dis = MapEx.getBytes2Int(attr, "Range") / 10.0f; // float dis = NumEx.bio2Int (MapEx.getBytes (attr, "Range")) / 10.0f; isFollow = MapEx.getBool(attr, "IsFollow"); isMulHit = MapEx.getBool(attr, "IsMulHit"); needRotate = MapEx.getBool(attr, "NeedRotate"); RefreshTargetMSec = MapEx.getBytes2Int(attr, "RefreshTargetMSec"); lastResetTargetTime = DateEx.nowMS; lastResetToPosTime = DateEx.nowMS; //dir.y = 0; Utl.RotateTowards(transform, dir); origin = orgPos; transform.position = origin; Vector3 toPos = Vector3.zero; if (target != null && dis <= 0) { toPos = target.transform.position; } else { toPos = origin + dir.normalized * dis; //toPos.y = 0; } int PosRandomFactor = MapEx.getBytes2Int(attr, "PosRandomFactor"); // int PosRandomFactor = NumEx.bio2Int (MapEx.getBytes (attr, "PosRandomFactor")); if (PosRandomFactor > 0) { toPos.x += attacker.fakeRandom(-PosRandomFactor, PosRandomFactor) / 100.0f; toPos.y += attacker.fakeRandom(-PosRandomFactor, PosRandomFactor) / 100.0f; } //if (isZeroY) { // toPos.y = 0; //} if (boxCollider != null) { if (MapEx.getBool(attr, "CheckTrigger")) { boxCollider.enabled = true; } else { boxCollider.enabled = false; } } haveCollider = (boxCollider != null && boxCollider.enabled); v3Diff = toPos - origin; if (angleOffset != 0) { Vector3 center = origin + v3Diff / 2.0f; // transform.position = center + new Vector3 (0, high, 0); Vector3 _v3 = Utl.RotateAround(center + new Vector3(0, high, 0), center, v3Diff, angleOffset * Mathf.Sin(Mathf.Deg2Rad * Utl.getAngle(v3Diff).y)); // transform.RotateAround (center, v3Diff, angleOffset * Mathf.Sin (Mathf.Deg2Rad * Utl.getAngle (v3Diff).y)); highV3 = _v3 - center; } else { highV3 = new Vector3(0, high, 0); } magnitude = v3Diff.magnitude <= 0.00001f ? 1 : 1.0f / v3Diff.magnitude; hitTarget = null; curveTime = 0; curveTime2 = 0; isStoped = false; isFireNow = true; RotateBullet(); CancelInvoke("timeOut"); int stayTime = MapEx.getBytes2Int(attr, "MaxStayTime"); // int stayTime = NumEx.bio2Int (MapEx.getBytes (attr, "MaxStayTime")); if (stayTime > 0.00001) { Invoke("timeOut", stayTime / 10.0f); } }
// Update is called once per frame public void FixedUpdate() { fixedDeltaTime = ignoreTimeScale ? Time.unscaledDeltaTime : Time.fixedDeltaTime; if (isMoveForward) { if (!Physics.Raycast(transform.position, transform.forward, out hitInfor, obsDistance, obstrucLayer.value)) { transform.Translate(Vector3.forward.x * 0.017f * speed, 0, Vector3.forward.z * 0.017f * speed); Utl.doCallback(onMovingCallback, this); } } else { if (!isMoveNow) { return; } curveTime += fixedDeltaTime * speed; subDiff = v3Diff * curveSpeed.Evaluate(curveTime); //*SCfg.self.fps.fpsRate; subDiff4Shadow = v3Diff * curveSpeed.Evaluate(curveTime); // subDiff = v3Diff.normalized*curveSpeed.Evaluate(curveTime)*Time.deltaTime; subDiff += highV3 * curveHigh.Evaluate(curveTime); //*SCfg.self.fps.fpsRate; if (isWoldPos) { dis = origin + subDiff - transform.position; } else { dis = origin + subDiff - transform.localPosition; } // Debug.DrawLine(transform.position, transform.position + v3Diff.normalized*(dis.magnitude + obsDistance)); if (!Physics.Raycast(transform.position, v3Diff, out hitInfor, dis.magnitude + obsDistance, obstrucLayer.value)) { if (isWoldPos) { transform.position = origin + subDiff; if (shadow != null) { shadow.position = origin + subDiff4Shadow; } // transform.Translate(subDiff, Space.World); } else { transform.localPosition = origin + subDiff; } } else { // 虽然遇到了障碍,但是高度还是需要计算,不然就会变成人越来越高 subDiff.x = 0; subDiff.z = 0; subDiff4Shadow.x = 0; subDiff4Shadow.z = 0; if (isWoldPos) { transform.position = transform.position + subDiff; if (shadow != null) { shadow.position = shadow.position + subDiff4Shadow; } } else { transform.localPosition = transform.localPosition + subDiff; } } if (shadow != null) { shadowPos = shadow.position; shadowPos.y = shadowHeight; shadow.position = shadowPos; } Utl.doCallback(onMovingCallback, this); if (isTurning) { Utl.RotateTowards(transform, v3Diff, turningSpeed); } if (curveTime >= 1) { onFinishTween(); } } }