加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
不知是否有高手知道。。。代码我贴到最后了。
今日我在学习unity的书时,跟着走到了实现角色移动的步骤,其中涉及到了主角是否站在地面上的检测。以下是各碰撞盒的体积及分布情况(就是那个浅浅的绿绿的框)。这两张图的左下角把法线向量长度打印了出来。
可以看到,与地面垂直碰撞法线长度是1,与地面和障碍物碰撞法线长度变成0.22,我就想问,为什么?
为什么与地面垂直碰撞法线长度是1,为什么与地面和障碍物碰撞法线长度变成0.22?
其中,角色的碰撞盒半径0.5。
我开始想会不会和主角圆形碰撞盒的半径有关系啊?但是半径怎么修改法线长度还是1!
我实在无法理解这个法线向量是怎么回事,无法想象这个法线向量的位置是从那里开始到那里结束的。
以下是我的Player代码,是很常规的实现,对unity比较熟练的人来说应该不难阅读。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour { private Transform playerTransform; private Rigidbody2D body; public float speed= 2f; private bool onGround; public float jumpPower = 150; // Start is called before the first frame update void Start() { body = GetComponent<Rigidbody2D>(); onGround = false; } // Update is called once per frame private void FixedUpdate() { KeyboardControl(); } //碰撞对象脱离与主角的碰撞时 private void OnCollisionExit2D(Collision2D collision) { onGround = false; } //碰撞对象与主角碰撞并保持接触时 private void OnCollisionStay2D(Collision2D collision) { int cnum = collision.contactCount;//获得碰撞点数量 for(int i = 0;i<cnum;i++){ ContactPoint2D contact = collision.GetContact(i); Debug.Log(contact.normal.y);//前两张图左下角显示了法线向量长度的结果 if(contact.normal.y > 0.8f){ if(!onGround){ onGround = true; } } } } private void KeyboardControl(){ float sp = speed * Input.GetAxis("Horizontal"); body.velocity = new Vector2(sp,body.velocity.y); if(onGround){ if(Input.GetAxis("Vertical")> 0.0f) {body.AddForce(new Vector2(0.0f,jumpPower));} } } }
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
private Transform playerTransform;
private Rigidbody2D body;
public float speed= 2f;
private bool onGround;
public float jumpPower = 150;
// Start is called before the first frame update
void Start()
{
body = GetComponent<Rigidbody2D>();
onGround = false;
}
// Update is called once per frame
private void FixedUpdate()
{
KeyboardControl();
}
//碰撞对象脱离与主角的碰撞时
private void OnCollisionExit2D(Collision2D collision)
{
onGround = false;
}
//碰撞对象与主角碰撞并保持接触时
private void OnCollisionStay2D(Collision2D collision)
{
int cnum = collision.contactCount;//获得碰撞点数量
for(int i = 0;i<cnum;i++){
ContactPoint2D contact = collision.GetContact(i);
Debug.Log(contact.normal.y);//前两张图左下角显示了法线向量长度的结果
if(contact.normal.y > 0.8f){
if(!onGround){
onGround = true;
}
}
}
}
private void KeyboardControl(){
float sp = speed * Input.GetAxis("Horizontal");
body.velocity = new Vector2(sp,body.velocity.y);
if(onGround){
if(Input.GetAxis("Vertical")> 0.0f)
{body.AddForce(new Vector2(0.0f,jumpPower));}
}
}
}
|