protected virtual void Awake()
        {
            mBody = GetComponent <Rigidbody>();

            mColls = new CollideInfo[maxColls];
            for (int i = 0; i < maxColls; i++)
            {
                mColls[i] = new CollideInfo();
            }

            mGravCtrl = GetComponent <GravityController>();

            //mTopBottomColCos = Mathf.Cos(sphereCollisionAngle * Mathf.Deg2Rad);
            mSlopLimitCos  = Mathf.Cos(slopLimit * Mathf.Deg2Rad);
            mAboveLimitCos = Mathf.Cos(aboveLimit * Mathf.Deg2Rad);

            mColl = GetComponent <Collider>();
            if (mColl != null)
            {
                if (mColl is SphereCollider)
                {
                    mRadius = ((SphereCollider)mColl).radius;
                }
                else if (mColl is CapsuleCollider)
                {
                    mCapsuleColl = mColl as CapsuleCollider;
                    mRadius      = mCapsuleColl.radius;
                }
            }

            mDefaultSpeedCap = speedCap;
        }
示例#2
0
        public override Vector3 GetUpVector(GravityController entity)
        {
            Vector3 position = entity.transform.position;

            Vector3 dir = inward ? transform.position - position : position - transform.position;

            return(dir.normalized);
        }
        public override Vector3 GetUpVector(GravityController entity)
        {
            DirInfo info = null;

            mCurDirs.TryGetValue(entity, out info);

            Vector3 entPos = entity.collider ? entity.collider.bounds.center : entity.transform.position;
            Vector3 entUp  = entity.up;

            Vector3 dir = inverse ? entPos - mCenter : mCenter - entPos;

            dir.Normalize();

            //check if we are within reasonable angle between entity's up and dir from center
            //if(Vector3.Angle(dir, entUp) < checkEntityAngle) {
            //check downward and see if we collide
            RaycastHit hit;

            if (Physics.SphereCast(entPos, checkRadius, useEntityUp ? -entUp : -dir, out hit, checkDistance, checkLayer))
            {
                if (Vector3.Angle(dir, hit.normal) < checkSurfaceAngle)
                {
                    if (info == null)
                    {
                        if (hit.normal != entUp) //TODO: tolerance value?
                        {
                            mCurDirs.Add(entity, new DirInfo(entUp, hit.normal));
                        }
                    }
                    else
                    {
                        info.targetDir = hit.normal;
                    }

                    if (mCurDirs.Count > 0 && !mUpdateActive)
                    {
                        StartCoroutine(DoUpdate());
                    }
                }
            }
            //}

            return(info != null ? info.curDir : entUp);
        }
示例#4
0
 public override Vector3 GetUpVector(GravityController entity)
 {
     return(transform.up);
 }
 public override void ItemRemoved(GravityController ctrl)
 {
     mCurDirs.Remove(ctrl);
 }
示例#6
0
 public virtual void ItemRemoved(GravityController ctrl)
 {
 }
示例#7
0
 public abstract Vector3 GetUpVector(GravityController entity);