Ejemplo n.º 1
0
        // 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);
            }
        }
Ejemplo n.º 2
0
        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);
                }
            }
        }
Ejemplo n.º 3
0
        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);
            }
        }
Ejemplo n.º 4
0
        // 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();
                }
            }
        }