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; }
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); }
public override Vector3 GetUpVector(GravityController entity) { return(transform.up); }
public override void ItemRemoved(GravityController ctrl) { mCurDirs.Remove(ctrl); }
public virtual void ItemRemoved(GravityController ctrl) { }
public abstract Vector3 GetUpVector(GravityController entity);