2014-11-01 5 views
-1

У меня есть игрок, который может носить предметы с оружием в игре «2.5D Platform Shooter», но проблема, которую я испытываю в данный момент, заключается в том, что каждый раз, когда я заставляю игрока удерживать объект (он имеет жесткое тело) и прижатый к стене, предмет проходит через стену. Пожалуйста, помогите поклонникам единства.Как сделать объект жесткого тела, который вы носите, не проходит через стены?

Этот код, который я использую ниже, нести объект.

#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

+0

У этого есть коллайдер, который не установлен в триггер, имеет твердое тело и не является кинематическим, но все еще проходит через :( – Johndii1491

ответ

1

добавления коллайдер в геймобжекты предотвратит объект от перемещения через друг друга, и если у него уже есть коллайдер и проходит через проверить настройки следующим
Rigidbody Является Kinamatic: Ложь, ли Triggger: ложные
установить Collision Detection из Rigidbody в Continuous или Continuous Dynamic
иногда быстро движущихся игровых объектов столкновение обыкновение быть обнаружены в этих sceneraios вы можете использовать Raycasting для collisin обнаружения здесь DontGoThrough скрипт, который используют raycasting для обнаружения столкновений

 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

+0

оба объекта имеют коллайдер –

+0

Я хотел бы выслать вам изображение того, как он выглядит, но он говорит, что мне нужно больше репутации :( – Johndii1491