试着创建一个漂亮的角色控制器,请停下来?

时间:2018-04-20 10:28:06

标签: unity3d

我是Unity的2D环境中的新手。

我正在尝试创建一个平台游戏。现在,我有一个简单的地图和我的播放器。

My simple map and my player

我的播放器附有一个脚本:

public class Player : MonoBehaviour
{
    public float speed;
    public float jump;
    public GameObject raycastPoint; // Positioned at 0.01 pixel below the player

    private SpriteRenderer spriteRenderer;
    private Rigidbody2D body; // Gravity Scale of the Rigidbody2D = 50
    private Animator animator;

    private void Start()
    {
        spriteRenderer = GetComponent<SpriteRenderer>();
        body = GetComponent<Rigidbody2D>();
        animator = GetComponent<Animator>();
    }

    private void Update()
    {
        float horizontal = Input.GetAxisRaw("Horizontal");

        if (horizontal == 1 && spriteRenderer.flipX)
        {
            spriteRenderer.flipX = false;
        }
        else if (horizontal == -1 && !spriteRenderer.flipX)
        {
            spriteRenderer.flipX = true;
        }

        body.velocity = new Vector2(horizontal * speed, body.velocity.y);

        animator.SetFloat("Speed", Mathf.Abs(horizontal));

        float vertical = Input.GetAxisRaw("Vertical");

        if (vertical == 1)
        {
            RaycastHit2D hit = Physics2D.Raycast(raycastPoint.transform.position, Vector2.down, 0.01f);

            if (hit.collider != null)
            {
                body.AddForce(new Vector2(0f, jump));
            }
        }
    }
}

现在我已经实现了左右移动。

对于跳跃,我在玩家的下方有一个儿童游戏对象,我正在向底部发射光线投射,以便我知道我的玩家是否接地。

我有两个问题。

问题第一。

有时我觉得我的“AddForce”行多次执行我的玩家跳得很高

Problem number one image

问题编号二。

当我跳到左侧或右侧的墙上时,如果我一直按下左侧或右侧的按键,我的玩家就不会再掉下来并靠在墙上。

Problem number two image

我试图将我的代码放入FixedUpdate方法(我知道它更好),但我得到了相同的结果。

我试图在连续时设置碰撞检测,但我得到了相同的结果。

感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

请针对您的第一个问题尝试此代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(BoxCollider2D))]
[RequireComponent(typeof(Rigidbody2D))]
[RequireComponent(typeof(Animator))]

public class Player_Controller : MonoBehaviour {
private Rigidbody2D body;
private bool canJump, facingRight;
private Animator anim;
[SerializeField]
private float moveSpeed, jumpForce;

void Start () 
{
    SetStartValues();
}

void FixedUpdate ()
{
    float horizontal = Input.GetAxis("Horizontal");
    animator.SetFloat("Speed", Mathf.Abs(horizontal));
    Flip(horizontal);
    Move(horizontal);
    Jump();
}

private void SetStartValues()
{
    body = GetComponent<Rigidbody2D>();
    anim = GetComponent<Animator>();
    canJump = true;
    facingRight = true;
}

private void Jump()
{
    if (Input.GetKeyDown(KeyCode.Space) && canJump)
    {
        body.AddForce(new Vector2(0, jumpForce));
        canJump = false;
    }
}

private void Move(float x)
{
    body.velocity = new Vector2(x * moveSpeed * Time.deltaTime, body.velocity.y);
}

private void Flip(float x)
{
    if (x > 0 && !facingRight|| x < 0 && facingRight)
    {
        facingRight = !facingRight;
        transform.localScale = new Vector2(transform.localScale.x * -1, transform.localScale.y) ;
    }
}

private void OnCollisionEnter2D(Collision2D collision)
{
    if (collision.gameObject.tag == "Ground")
    {
        canJump = true;
    }
}
}

别忘了把#34; Ground&#34;标记在你的地面物体上。