C# 只跳一次
我对C#(Unity)的编码有一些问题;我试图让我的角色随着空间移动和跳跃。但是由于某些原因,角色会跳一次,当再次到达地面时,它会停止跳!有人能帮我吗?我试图在Unity上勾选和取消勾选“Is jumping”和“Double jumping”,但似乎没有任何效果:C# 只跳一次,c#,unity3d,C#,Unity3d,我对C#(Unity)的编码有一些问题;我试图让我的角色随着空间移动和跳跃。但是由于某些原因,角色会跳一次,当再次到达地面时,它会停止跳!有人能帮我吗?我试图在Unity上勾选和取消勾选“Is jumping”和“Double jumping”,但似乎没有任何效果: using System.Collections; using System.Collections.Generic; using UnityEngine; public class Player : MonoBehaviour
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour {
public float Speed;
public float JumpForce;
public bool isJumping;
public bool doubleJump;
private Rigidbody2D rig;
// Use this for initialization
void Start () {
rig = GetComponent<Rigidbody2D>();
}
// Update is called once per frame
void Update () {
Move();
Jump();
}
void Move () {
Vector3 movement = new Vector3(Input.GetAxis("Horizontal"), 0f, 0f);
transform.position += movement * Time.deltaTime * Speed;
}
void Jump () {
if(Input.GetButtonDown("Jump"))
{
if(!isJumping){
rig.AddForce(new Vector2(0f, JumpForce), ForceMode2D.Impulse);
doubleJump = true;
}else{
if(doubleJump){
rig.AddForce(new Vector2(0f, JumpForce), ForceMode2D.Impulse);
doubleJump = false;
}
}
}
}
void OnCollisionEnter2D(Collision2D collision){
if(collision.gameObject.layer == 8)
{
isJumping = false;
}
}
void OnCollisionExit2D(Collision2D collision){
if(collision.gameObject.layer == 8){
isJumping = true;
}
}
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共类玩家:单一行为{
公众浮标速度;
公共安全部队;
公共场所在跳跃;
公共跳远;
私人Rigidbody2D钻机;
//用于初始化
无效开始(){
rig=GetComponent();
}
//每帧调用一次更新
无效更新(){
Move();
跳跃();
}
无效移动(){
Vector3移动=新的Vector3(Input.GetAxis(“水平”),0f,0f;
transform.position+=移动*时间.延时*速度;
}
空跳(){
if(Input.GetButtonDown(“跳转”))
{
如果(!正在跳跃){
装备添加力(新矢量2(0f,跳跃力),力模式2D脉冲);
双跳=真;
}否则{
中频(双跳){
装备添加力(新矢量2(0f,跳跃力),力模式2D脉冲);
双跳=假;
}
}
}
}
空心OnCollisionInter2D(碰撞2D碰撞){
if(collision.gameObject.layer==8)
{
isJumping=false;
}
}
无效OnCollisionExit2D(碰撞2D碰撞){
if(collision.gameObject.layer==8){
isJumping=true;
}
}
}
您在Jump()
中的逻辑似乎是正确的,所以我猜正在跳转的设置不正确。可能是你在地面上,然后跳到不在第8层的平台上。在这种情况下,OnCollisionInter2D
将永远不会被调用来设置您的IsJumping
值
void OnCollisionEnter2D(Collision2D collision){
if(collision.gameObject.layer == 8)
{
isJumping = false;
}
}
void OnCollisionExit2D(Collision2D collision){
if(collision.gameObject.layer == 8){
isJumping = true;
}
}
我对您的代码进行了一些编辑,使其更具可读性(尽管其中一些是有品味的),并添加了一些一般提示
使用System.Collections.Generic;
使用UnityEngine;
//加https://docs.unity3d.com/ScriptReference/RequireComponent.html
[RequiredComponent(类型)(刚体))]
公共类玩家:单一行为{
公众浮标速度;
公共安全部队;
//布尔人的命名应遵循以下准则:https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/names-of-type-members#names-财产
公共学校停课;
公共图书馆已被取消;
私人Rigidbody2D钻机;
//用于初始化
无效开始(){
//另一个技巧是,只需写出变量名,不要缩短它们(再次参见指南)。
rig=GetComponent();
}
//每帧调用一次更新
无效更新(){
Move();
跳转检查();
}
无效移动(){
//一些提示
//A)尝试将任何与physiscs相关的移动移动到fixedUpdate
//B)尝试使用.AddForce()移动刚体不使用transform.position的对象。请参见:https://docs.unity3d.com/ScriptReference/Rigidbody.html
Vector3移动=新的Vector3(Input.GetAxis(“水平”),0f,0f;
transform.position+=移动*时间.延时*速度;
}
无效跳转检查(){
if(Input.GetButtonDown(“跳转”))
{
//如果我们被禁飞就跳
如果(接地)
{
跳跃();
HasDoubleJump=假;
}
//如果我们在空中(!IsGrounded)并且我们还没有双跳,就跳。
否则如果(!hasdublejumped)
{
跳跃();
hasdublejump=true;
}
其他的
{
//我们在空中,我们跳了两次,什么也不做!
}
}
}
私有无效跳转()=>
装备添加力(新矢量2(0f,跳跃力),力模式2D脉冲);
空心OnCollisionInter2D(碰撞2D碰撞){
if(collision.gameObject.layer==8)
{
IsGrounded=true;
}
}
无效OnCollisionExit2D(碰撞2D碰撞){
if(collision.gameObject.layer==8){
isfounded=false;
}
}
}
首先将isJumping重命名为IsGround-因为这很可能就是您测试的对象,对吗?如果您添加Debug.Log(isJumping);在if(!isJumping)之前的Jump()函数中,在第二次跳转之后得到什么值?有些东西告诉我,在第一次跳转之后,它再也不会被设置为false。很抱歉打扰,但我想知道Vector3/Vector2等的含义!你能告诉我吗0@Aserli向量基本上是一对轴Vector2
有一个X轴和一个Y轴,Vector3
有一个X轴、Y轴和Z轴。这是用于职位。每个变换都有一个统一的矢量位置。将+1添加到Y会使对象沿Y轴(向上)移动一步,将-1添加到Y轴上会使对象向下移动一步,以此类推。