Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检查unity2d平台游戏的场地_C#_Unity3d_Collision_Raycasting - Fatal编程技术网

C# 如何检查unity2d平台游戏的场地

C# 如何检查unity2d平台游戏的场地,c#,unity3d,collision,raycasting,C#,Unity3d,Collision,Raycasting,我正在尝试制作一个2d平台,你可以从侧面看到球员。我希望他不断地移动,你必须在正确的时间按下空格,这样他就不会摔倒。现在一切正常,但他没有与地面相撞。我希望它就像他在墙后跑一样,所以我想忽略我制作的某一层,并与下面的盒子碰撞。到目前为止,我已经尝试了光线投射,观看了多个教程,并进行了长方体碰撞。盒子碰撞成功了,但要把所有的平台都算作固体,我需要50个盒子碰撞器。这是我目前的代码: public int playerSpeed = 10; public int playerJumpPowe

我正在尝试制作一个2d平台,你可以从侧面看到球员。我希望他不断地移动,你必须在正确的时间按下空格,这样他就不会摔倒。现在一切正常,但他没有与地面相撞。我希望它就像他在墙后跑一样,所以我想忽略我制作的某一层,并与下面的盒子碰撞。到目前为止,我已经尝试了光线投射,观看了多个教程,并进行了长方体碰撞。盒子碰撞成功了,但要把所有的平台都算作固体,我需要50个盒子碰撞器。这是我目前的代码:

public int playerSpeed = 10;
    public int playerJumpPower = 1250;
    public float moveX;
    public float playerYSize = 2;
    public LayerMask mainGround;
    public float playerFallSpeed = 5;

    void Awake(){

    }

    // Update is called once per frame
    void Update()
    {
        RaycastHit2D hit = Physics2D.Raycast(transform.position, new Vector2(10, 0));
        if(hit.distance < 0.7f){
            print("hi");
        }

        Vector3 characterTargetPosition = new Vector3(transform.position.x + playerSpeed, transform.position.y, transform.position.z);
        transform.position = Vector3.Lerp(transform.position, characterTargetPosition, playerSpeed * Time.deltaTime);

        if(Input.GetKeyDown("space")){
            // float playerTargetPosY = transform.position.y + playerJumpPower;
            // Vector3 characterTargetPosition = new Vector3(transform.position.x, playerTargetPosY, transform.position.z);
            // transform.position = Vector3.Lerp(transform.position, characterTargetPosition, playerJumpPower * Time.deltaTime);

            gameObject.GetComponent<Rigidbody2D>().AddForce(Vector2.up * playerJumpPower);
        }
        //PlayerMove();
    }
public int playerSpeed=10;
公共int-playerJumpPower=1250;
公共浮动moveX;
公共浮球大小=2;
公共层屏蔽主地面;
公共浮球速度=5;
无效唤醒(){
}
//每帧调用一次更新
无效更新()
{
RaycastHit2D hit=Physics2D.Raycast(transform.position,新向量2(10,0));
如果(命中距离<0.7f){
打印(“hi”);
}
Vector3 characterTargetPosition=新的Vector3(transform.position.x+播放器速度,transform.position.y,transform.position.z);
transform.position=Vector3.Lerp(transform.position、characterTargetPosition、playerSpeed*Time.deltaTime);
if(Input.GetKeyDown(“空格”)){
//float playerTargetPosY=transform.position.y+playerJumpPower;
//Vector3 characterTargetPosition=新的Vector3(transform.position.x,playerTargetPosY,transform.position.z);
//transform.position=Vector3.Lerp(transform.position、characterTargetPosition、playerJumpPower*Time.deltaTime);
gameObject.GetComponent().AddForce(Vector2.up*playerJumpPower);
}
//PlayerMove();
}

我的球员身上有一个刚体,所以现在他只是从地上掉下来,但跳跃确实有效。如果有什么简单的方法可以做到这一点。像一些脚本,教程,或网站,我是开放的。请帮忙。

你的播放器里有刚体吗?运动的物体通常必须有一个刚体

(很抱歉将此作为答复发布。暂时无法评论)

编辑:

试试这个:

Rigidbody2D rb;

void Awake()
{
    rb = GetComponent<Rigidbody2D>();
}

//Physics usually are done in FixedUpdate to be more constant
public void FixedUpdate(){
    if (Input.GetKeyDown("space"))
    {
        if(!rb.simulated)
            //player can fall
            rb.simulated = true;

        rb.AddForce(Vector2.up * playerJumpPower);
    }
    else
    {
        //third argument is the distance from the center of the object where it will collide
        //therefore you want the distance from the center to the bottom of the sprite
        //which is half of the player height if the center is actually in the center of the sprite
        RaycastHit2D hit = Physics2D.Raycast(transform.position, -Vector2.up, playerYSize / 2);

        if (hit.collider)
        {
            //make player stop falling
            rb.simulated = false;
        }
    }
}
Rigidbody2D-rb;
无效唤醒()
{
rb=GetComponent();
}
//物理学通常是在固定更新中进行的,以使其更为恒定
public void FixedUpdate(){
if(Input.GetKeyDown(“空格”))
{
如果(!rb.simulated)
//玩家可能会摔倒
rb.simulated=true;
rb.AddForce(矢量2.up*playerJumpPower);
}
其他的
{
//第三个参数是从物体中心到碰撞点的距离
//因此,您需要从精灵的中心到底部的距离
//如果中心位于精灵的中心,则为玩家身高的一半
RaycastHit2D hit=Physics2D.Raycast(transform.position,-Vector2.up,playerYSize/2);
if(命中对撞机)
{
//使运动员停止跌倒
rb.simulated=false;
}
}
}
如果玩家是唯一会与某个物体碰撞的物体,你可以从玩家不会碰撞的物体中取出碰撞器

否则,您可以使用
hit.collider.gameObject.layer
检查被碰撞对象的层,并确定玩家是否将与该层碰撞

(请注意,您必须与层的索引进行比较。如果您想通过其名称获取索引,可以使用
LayerMask.NameToLayer(/*layer name*/)

每次你想对刚体做点什么(比如AddForce()),你都必须做
rb.simulated=true


希望有帮助:)

你给你的角色添加了碰撞器吗?是的,我有一个碰撞器。你的角色掉到地上了,但是你有碰撞器。是什么提供了
层碰撞矩阵
?编辑->项目设置->在图层碰撞矩阵中检查所有内容。我应该检查和取消检查什么。这有助于避免一些碰撞器相互碰撞。如果要忽略某些层,(层碰撞矩阵)可能会有所帮助。但是现在你有一个对撞机连在地面上,另一个连在地面上,玩家仍然穿过地面?是的,我有一个刚体。