/// <summary>何かに衝突しているならtrue</summary> public static bool isCollided(MapCharacter aCharacter) { mCharacter = aCharacter; mCollider = aCharacter.mEntityPhysicsBehaviour.mAttriubteCollider; mAttribute = aCharacter.mEntityPhysicsBehaviour.mAttribute; MapPhysics.CollisionType tType; RaycastHit[] tHits = castAttribute(new Vector3(0, 1, 0), 0, out tType); mCharacter = null; mCollider = null; mAttribute = null; return(tType == MapPhysics.CollisionType.collide); }
//<summary>このbehaviourが引数のentityがいる位置に侵入できるか</summary> public bool canEnter(EntityPhysicsAttribute aEntityPhysics) { switch (mAttribute) { case Attribute.ghost: return(true); case Attribute.ornament: case Attribute.walking: case Attribute.floating: case Attribute.flying: switch (aEntityPhysics.mAttribute) { case Attribute.ghost: return(true); case Attribute.ornament: case Attribute.walking: case Attribute.floating: case Attribute.flying: return(false); case Attribute.pygmy: return(true); } break; case Attribute.pygmy: switch (aEntityPhysics.mAttribute) { case Attribute.ghost: return(true); case Attribute.ornament: case Attribute.walking: case Attribute.flying: return(true); case Attribute.pygmy: return(false); } break; } Debug.LogWarning("EntityPhysicsAttribute : 定義されていない属性の当たり判定「" + mAttribute.ToString() + "」「" + aEntityPhysics.mAttribute.ToString() + "」"); return(false); }
///<summary>キャラを移動させる(同フレームでさらに移動可能ならtrue)</summary> public static bool moveCharacter(MapCharacter aCharacter) { if (aCharacter.mMovingData.mDirection == Vector3.zero) { //移動しない場合 aCharacter.mMovingData.mRemainingDistance = 0; return(false); } //移動処理前の座標を記録 aCharacter.mMovingData.mDeltaPrePosition = aCharacter.mMapPosition; //最後の移動方向記録 aCharacter.mMovingData.mLastDirection = aCharacter.mMovingData.mDirection; //移動処理で使うデータ収集・記録 mCharacter = aCharacter; mAttribute = aCharacter.mEntityPhysicsBehaviour.mAttribute; mCollider = mAttribute.mCollider; mDirection = aCharacter.mMovingData.mDirection.normalized; mDeltaDistance = aCharacter.mMovingData.mDeltaDistance; if (kMaxDeltaDistance < mDeltaDistance) { mDeltaDistance = kMaxDeltaDistance; } mRemainingDistance = mCharacter.mMovingData.mRemainingDistance; //移動させる MoveResult tResult = moveDelta(); if (tResult.mCollisionType == MapPhysics.CollisionType.pass) { } else if (tResult.mCollisionType == MapPhysics.CollisionType.collide) { mCharacter.mMovingData.mRemainingDistance = 0; return(false); } else if (tResult.mCollisionType == MapPhysics.CollisionType.stop) { mCharacter.mMovingData.mRemainingDistance = 0; return(false); } //残りの移動距離を減算 mCharacter.mMovingData.mRemainingDistance -= mDeltaDistance; return(mCharacter.mMovingData.mRemainingDistance > 0); }
public static CollisionType canCollide(EntityPhysicsAttribute aAttribute1, MapPhysicsAttribute aAttribute2) { //相手の属性で分岐 if (aAttribute2 is TileGroundPhysicsAttribute) { return(aAttribute1.canEnter((TileGroundPhysicsAttribute)aAttribute2) ? CollisionType.pass : CollisionType.collide); } if (aAttribute2 is SlopeTilePhysicsAttribute) { return(((SlopeTilePhysicsAttribute)aAttribute2).canBeEntered(aAttribute1.mBehaviour.mMapPosition) ? CollisionType.pass : CollisionType.collide); } if (aAttribute2 is EntityPhysicsAttribute) { return(aAttribute1.canEnter((EntityPhysicsAttribute)aAttribute2) ? CollisionType.pass : CollisionType.collide); } if (aAttribute2 is TriggerPhysicsAttribute) { return(((TriggerPhysicsAttribute)aAttribute2).canBeEntered(aAttribute1)); } throw new System.Exception("MapPhysics : entityと未定義の属性との衝突判定「" + aAttribute2.GetType().ToString() + "」"); }
//<summary>引数のentityがこのtriggerに侵入できるか</summary> public MapPhysics.CollisionType canBeEntered(EntityPhysicsAttribute aEntityPhysics) { return(mTrigger.canCollide(aEntityPhysics.mEntity)); }