2014-11-01 68 views
-1

我有一名玩家在「2.5D平臺射擊遊戲」遊戲中可以攜帶物品,但是我現在遇到的問題是每當我讓玩家抓住物體時(它有一個剛體)並壓在牆上,物體穿過牆壁。請幫助團結球迷。如何製作攜帶的剛體物體不通過牆壁?

這是我在下面使用的代碼來攜帶對象。

#pragma strict 

var catchRange = 30.0; 
var holdDistance = 4.0; 
var minForce = 1000; 
var maxForce = 10000; 
var forceChargePerSec = 3000; 
var layerMask : LayerMask = -1;  

@HideInInspector 
var anim : Animator; 

enum GravityGunState { Free, Catch, Occupied, Charge, Release}; 
private var gravityGunState : GravityGunState = 0; 
private var rigid : Rigidbody = null; 
private var currentForce = minForce; 

function FixedUpdate() 
{ 
if(gravityGunState == GravityGunState.Free) 
{ 
if(Input.GetButton("Fire1")) 
{ anim.SetBool("Shoot", true); 
var hit : RaycastHit; 
if(Physics.Raycast(transform.position, transform.forward, hit, catchRange, layerMask)) 
{ 
if(hit.rigidbody) 
{ 
rigid = hit.rigidbody; 
gravityGunState = GravityGunState.Catch; 

} 
} 
}else if(!hit.rigidbody){anim.SetBool("Shoot", false);} 
} 

else if(gravityGunState == GravityGunState.Catch) 
{  
rigid.useGravity = false; 
rigid.MovePosition(transform.position + transform.forward * holdDistance); 
if(!Input.GetButton("Fire1")) 
gravityGunState = GravityGunState.Occupied; 
} 

else if(gravityGunState == GravityGunState.Occupied) 
{ 

if(Physics.Raycast(transform.position, transform.forward, hit, catchRange, layerMask)){ 
Debug.DrawLine (transform.position, hit.point, Color.red); 
}  
rigid.MovePosition(transform.position + transform.forward * holdDistance); 
if(Input.GetButton("Fire1")) 
gravityGunState = GravityGunState.Charge; 
} 

else if(gravityGunState == GravityGunState.Charge) 
{ 
rigid.MovePosition(transform.position + transform.forward * holdDistance); 
if(currentForce < maxForce) 
{ 
currentForce += forceChargePerSec * Time.deltaTime; 
} 

else 
{  
currentForce = maxForce; 
} 

if(!Input.GetButton("Fire1")) 
gravityGunState = GravityGunState.Release; 
rigid.useGravity = true; 
} 

else if(gravityGunState == GravityGunState.Release) 
{ 
rigid.AddForce(transform.forward * currentForce); 
currentForce = minForce; 
gravityGunState = GravityGunState.Free; 
} 

} 

@script ExecuteInEditMode() 
+0

聽起來像對象沒有碰撞器。 – LearnCocos2D 2014-11-01 10:36:22

+0

它有一個對撞機,沒有設置觸發,具有剛體,而不是運動學的,但仍然通過:( – Johndii1491 2014-11-01 12:11:54

回答

1

加入撞機gameObjects將防止物體從通過相互移動,如果它已經具備了對撞機,它是通過檢查你的設置如下
剛體是Kinamatic:假, 是Triggger:假
設置的剛體的碰撞檢測連續連續動態
有時快速移動的遊戲對象碰撞不會在這些sceneraios被檢測到,你可以使用光線投射這裏collisin檢測DontGoThrough腳本使用光線投射碰撞檢測

 using UnityEngine;  
     using System.Collections; 

     public class DontGoThroughThings : MonoBehaviour   
     { 

      public LayerMask layerMask; //make sure we aren't in this layer 

      public float skinWidth = 0.1f; //probably doesn't need to be changed 

      private float minimumExtent; 

      private float partialExtent; 

      private float sqrMinimumExtent; 

      private Vector3 previousPosition; 

      private Rigidbody myRigidbody; 

      //initialize values 

      void Awake() 

      { 

       myRigidbody = rigidbody; 

       previousPosition = myRigidbody.position; 

       minimumExtent = Mathf.Min(Mathf.Min(collider.bounds.extents.x, collider.bounds.extents.y), collider.bounds.extents.z); 

       partialExtent = minimumExtent * (1.0f - skinWidth); 

       sqrMinimumExtent = minimumExtent * minimumExtent; 

      } 

      void FixedUpdate() 

      { 

       //have we moved more than our minimum extent? 

       Vector3 movementThisStep = myRigidbody.position - previousPosition; 

       float movementSqrMagnitude = movementThisStep.sqrMagnitude; 

       if (movementSqrMagnitude > sqrMinimumExtent) 

       { 

        float movementMagnitude = Mathf.Sqrt(movementSqrMagnitude); 

        RaycastHit hitInfo; 



        //check for obstructions we might have missed 

        if (Physics.Raycast(previousPosition, movementThisStep, out hitInfo, movementMagnitude, layerMask.value)) 

        myRigidbody.position = hitInfo.point - (movementThisStep/movementMagnitude)*partialExtent; 

       }  

       previousPosition = myRigidbody.position; 

      } 

     } 
+0

)它有一個對撞機,沒有設置觸發,具有剛體,並且不是運動的,並且設置爲連續或連續的動態但仍然通過:( 我想把我的對象上,我要解除對嗎? – Johndii1491 2014-11-01 12:13:16

+0

這兩個對象都有對撞機 – 2014-11-01 12:19:40

+0

我想給你看看它的樣子,但它說我需要更多的聲譽:( – Johndii1491 2014-11-01 12:20:18