2017-05-28 69 views
0

我有一名玩家和一些NPC。 NPC有隨機動作,我控制着球員的動作。他們都有處理物理的RigidBody2D和處理碰撞的BoxCollider2D。Unity:停止RigidBody2D互相推送

但是,當我走進一個NPC時,我的播放器將它推開。如果NPC在球員靜止時進入我的球員,那也是一樣。

我無法將對象的質量設置爲某個極端數,因爲這會干擾我們在遊戲中與其他對象的行爲。

我想要什麼: 當NPC與玩家碰撞,全國停止(如果設置了播放器質量前我得到這個效果1000,但隨後玩家可以推動人大,我不想。 ),NPC扮演着「牆」的角色,即它不會移動,但是玩家也不能將它推開。我怎樣才能做到這一點?

編輯:所以,我創建了自己的方法就可以了:

void OnCollisionEnter2D(Collision2D other){ 
    if (other.gameObject.name == "Player") { 
     collidedWithPlayer = true; //we only move if !collidedWithPlayer 
     isMoving = false; //stop moving 
     myRigidBody.mass = 1000; //turn NPC into "wall" 
    } 
} 

void OnCollisionExit2D(Collision2D other){ 
    if (other.gameObject.name == "Player") { 
     collidedWithPlayer = false; 
     waitCounter = waitTime; //stop NPC from starting to move right after we exit 
     myRigidBody.mass = 1; 
    } 
} 

我的意思是這工作,但有沒有做到這一點沒有原生的方法?

回答

1

你要做的事實質上是用一個「現實」的物理引擎來創造出不切實際的物理學。這就是Unity內置函數不支持它的原因。此外,假定與對象羣體搞混不是一個好主意,你是正確的。

這裏有一個建議,避免與質量玩。這有點kludgey,但試一試,看看它是否適合你。 (我假設你的播放器剛體不是Kinematic?)

第1步:創建2個新圖層;稱它們爲NPCWall和PlayerWall。設置2D物理,使玩家與NPCWall碰撞,NPC與PlayerWall發生碰撞,但玩家不會與NPC碰撞。 (如果你的NPC和玩家在同一層,那麼當然把它們放在兩個單獨的層上。)

第2步:創建一個NPCWall預製件,使用與NPC相同種類的對撞機。我假設你只有一個NPC的大小。同樣,創建一個使用與玩家相同種類的對撞機的PlayerWall預製件。將NPCWall預製設置爲NPCWall圖層,並將PlayerWall預製爲PlayerWall圖層。

第3步:我們不能將NPCWall交給NPC,因爲它最終會成爲剛體的一部分。因此,添加一個簡單的腳本來NPCWall和PlayerWall:

public class TrackingWall 
{ 
    //This invisible wall follows an NPC around to block the player. 
    //It also follows the player around to block NPCs. 

    Transform followTransform; 

    public void Init(Transform targetTrans) 
    { 
     followTransform = targetTrans; 
     transform.position = followTransform.position; 
     transform.rotation = followTransform.rotation; 
    } 

    void Update() 
    { 
     if (followTransform == null) 
      Destroy(gameObject); 
     transform.position = followTransform.position; 
     transform.rotation = followTransform.rotation; 
    } 
} 

步驟4:在NPC和玩家腳本:

TrackingWall myWallPrefab; 

void Start() 
{ 
    [whatever else you are doing in Start()] 
    TrackingWall myWall = Instantiate<TrackingWall>(myWallPrefab); 
    myWall.Init(transform); 
} 

顯然,對於NPC的,myWallPrefab應設置爲NPCWall預製,並對於玩家來說,myWallPrefab應該設置爲PlayerWall預製。

理論上,這應該爲每個角色提供一個不可移動的不可移動的牆,只有在它們移動時纔會移動,阻止其他角色推動它們,並在它們被破壞時自行清理。我不能保證它會起作用!