2013-03-06 188 views
0

我正在研究3D格斗游戏。我有两个角色与他们的动画。我已经应用了我定制的角色控制器和角色控制器脚本。我有两个按钮之一移动魔鬼,一个移动后脑勺。四个按钮可以播放不同的动画,就像做一个拳头,打一条腿等等。它的工作表现很好。 现在我已经使用胶囊对象与他们的胶囊对撞机作为不同骨头的孩子。就像我已经把一个胶囊物体与他们的对撞机放在左手骨骼的孩子之中.SO骨骼移动那个物体将会移动.. 我还在第二个球员身体上放置了一个帽子,我把它放在头下方和腿上方它的意思是它放置在胸部。我也使用了没有重力的刚体,并且在所有胶囊中都点击了触发器功能。现在我想要当我的第一个玩家的手碰到放置胶囊的第二个玩家主体时,它会调用一个函数。但是在脚本中它不会打电话..我不知道什么是问题。可以任何身体指导我。这是我的脚本Unity3D中的碰撞检测

public function Start() : void { 
f_inAirStartTime = Time.time; 
} 
//Checking if the character hit the ground (collide Below) 
public function IsGrounded() : boolean { 
return (c_collisionFlags & CollisionFlags.CollidedBelow); 
} 
//Getting if the character is jumping or not 
public function IsJumping() : boolean { 
return b_isJumping; 
} 
//Checking if the character is in the air more than the minimum time 
//This function is to make sure that we are falling not walking down slope 
public function IsAir() : boolean { 
return (f_inAirTime > f_minAirTime); 
} 
//Geting if the character is moving backward 
public function IsMoveBackward() : boolean { 
return b_isBackward; 
} 
public function Update() : void { 
//Get Main Camera Transform 
var cameraTransform = Camera.main.transform; 
//Get forward direction of the character 
v3_forward = cameraTransform.TransformDirection(Vector3.forward); 
v3_forward.y = 0; //Make sure that vertical direction equals zero 
// Right vector relative to the character 
// Always orthogonal to the forward direction vector 
v3_right = new Vector3(v3_forward.z, 0, -v3_forward.x); 

//Get Horizontal move - rotation 
var f_hor : float ;//= Input.GetAxis("Horizontal"); 
if(backword==true) 
{ 
f_hor=1; 
backword=false; 
} 
if(farword==true) 
{ 
f_hor=-1; 
farword=false; 
} 











//Get Vertical move - move forward or backward 
var f_ver : float = Input.GetAxis("Vertical"); 
//If we are moving backward 
if (f_ver < 0) { 
b_isBackward = true; 
} else { 
b_isBackward = false; 
} 
//Get target direction 
var v3_targetDirection : Vector3 = (f_hor * v3_right) + (f_ver * v3_forward); 
//If the target direction is not zero - that means there is no button pressing 
if (v3_targetDirection != Vector3.zero) { 
//Rotate toward the target direction 
v3_moveDirection = Vector3.Slerp(v3_moveDirection, v3_targetDirection, f_rotateSpeed * Time.deltaTime); 
v3_moveDirection = v3_moveDirection.normalized; //Get only direction by normalizing our target vector 
} else { 
v3_moveDirection = Vector3.zero; 
} 
//Checking if character is on the ground 
if (!b_isJumping) { 
//Holding Shift to run 
//if (Input.GetKey (KeyCode.LeftShift) || Input.GetKey (KeyCode.RightShift)) { 
if(Left_punch_anim){ 


b_isRun = true; 

f_moveSpeed = runSpeed; 
//Right_punch_anim=false; 
} else { 
b_isRun = false; 
f_moveSpeed = speed; 
} 
//Press Space to Jump 
if (Input.GetButton ("Jump")) { 
f_verticalSpeed = jumpSpeed; 
b_isJumping = true; 
} 
} 
//Debug.Log(controller.velocity.sqrMagnitude+"magniture"); 

// Apply gravity 
if (IsGrounded()) { 
f_verticalSpeed = 0.0; //if our character is grounded 
b_isJumping = false; //Checking if our character is in the air or not 
f_inAirTime = 0.0; 
f_inAirStartTime = Time.time; 
} else { 
f_verticalSpeed -= gravity * Time.deltaTime; //if our character in the air 
//Count Time 
f_inAirTime = Time.time - f_inAirStartTime; 
} 
// Calculate actual motion 
var v3_movement : Vector3 = (v3_moveDirection * f_moveSpeed) + Vector3 (0, f_verticalSpeed, 0); // Apply the vertical speed if character fall down 
v3_movement *= Time.deltaTime; 
// Move the controller 
c_collisionFlags = controller.Move(v3_movement); 
//Play animation 
if (b_isJumping) { 
if (controller.velocity.y > 0) { 
animation[jumpPoseAnimation.name].speed = jumpAnimationSpeed; 
animation.CrossFade(jumpPoseAnimation.name, 0.1); 
} else { 
animation[fallPoseAnimation.name].speed = fallAnimationSpeed; 
animation.CrossFade(fallPoseAnimation.name, 0.1); 
} 
} else { 
if (IsAir()) { // Fall down 
animation[fallPoseAnimation.name].speed = fallAnimationSpeed; 
animation.CrossFade(fallPoseAnimation.name, 0.1); 
} else { 
if(controller.velocity.sqrMagnitude < 0.1) { 
    if(Left_punch_anim) 
    { 

    animation[leftanimAnimation.name].speed = runAnimationSpeed; 
animation.CrossFade(leftanimAnimation.name, 0.5); 
Left_punch_anim=false; 
idlemode=true; 

    } 
    else 
    if(Right_punch_anim) 
    { 

    animation[rightanimAnimation.name].speed = runAnimationSpeed; 
animation.CrossFade(rightanimAnimation.name, 0.5); 
Right_punch_anim=false; 
idlemode=true; 

    } 
    else 
    { 
//Debug.Log(controller.velocity.sqrMagnitude+"hjgkjgkjg"); 
animation[idleAnimation.name].speed = idleAnimationSpeed; 
animation.CrossFade(idleAnimation.name, 0.1); 
} 
} else { //Checking if the character walks or runs 
if (b_isRun) { 
//Debug.Log("In the run animation"); 
animation[leftanimAnimation.name].speed = runAnimationSpeed; 
animation.CrossFade(leftanimAnimation.name, 0.1); 
} else { 
animation[walkAnimation.name].speed = walkAnimationSpeed; 
animation.CrossFade(walkAnimation.name, 0.1); 
} 
} 
} 
} 
if(idlemode) 
{ 

} 
//Update rotation of the character 
if (v3_moveDirection != Vector3.zero) { 
transform.rotation = Quaternion.LookRotation(v3_moveDirection); 
} 
} 
public function OnControllerColliderHit(hit:ControllerColliderHit) 
{ 
    //  Debug.Log("Collision have been enter"); 
    } 

/*public function OnTriggerEnter(other:Collider) 
{ 

Debug.Log(other.gameObject.name); 
}*/ 
public function OnCollisionEnter(other:Collision) 
{ 
Debug.Log("collision is enter"); 
} 
function OnTriggerEnter(col:Collider) 
{ 
Debug.Log(col.gameObject.name); 

} 

回答

4

好的。我假设你既没有得到OnCollisionEnter也没有得到OnTriggerEnter调用。

确保具有这些方法的脚本位于实际的GameObject上,该对象具有碰撞器组件。

OnCollisionEnter引用:

“请注意,如果对撞机的一个也有附加的非运动刚体碰撞事件仅发送。”

综上所述:如果你实际使用的物理系统中移动的对象,由于力OnCollisionEnter只叫,碰撞等

如果你想只登记一击,没有它通过引起运动物理系统,你可以使用OnTriggerEnter。 在这种情况下,刚体必须位于移动物体上,并且至少有一个碰撞体必须设置为isTrigger。

还要确保图层设置为在projectSettings-> Physics中发生碰撞。

希望这可以帮助你。

+0

感谢您的回放...实际上我的角色我有字符控制器适用于整个网格,我有不同的胶囊对撞机在不同的身体parts.I没有使用任何phsyics我只是想当这两个字符相撞那么函数将触发up..I使用OnTriggerEnter函数...但它不工作 – 2013-03-06 10:13:00

+0

我没有理解你的最后一行......“还要确保图层设置为在projectSettings-> Physics中碰撞。” – 2013-03-06 10:15:53

+1

在Unity顶部栏中 - 单击edit-> projectSettings-> Physics。这会在检查器中显示一个矩阵,允许您选择哪些图层与其他图层相冲突。 – sune 2013-03-07 12:33:41