控制2D游戏玩家上下左右移动

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class playerCon : MonoBehaviour
{
    public float smoothing = 10;
    private Vector2 targetPos = new Vector2(1f, 1f);

    private int posx = 1;
    private int posy = 1;

    private Rigidbody2D rig;
    private Collider2D collider;
    private float restTime = 0.5f;
    private float restTimer = 1f;//定义一个计时器  多久可以进行一次移动的输入

    private void Awake()
    {
        restTimer = restTime;//
        rig = GetComponent<Rigidbody2D>();
        collider = GetComponent<Collider2D>();
    }
    //这种方式用于2D控制角色移动的效果  是角色可以斜着走
    private void Update()
    {
        rig.MovePosition(Vector2.Lerp(transform.position, targetPos, smoothing * Time.deltaTime));//这里移动有点先快后慢

        restTimer -= Time.deltaTime;
        if (restTimer >= 0)
        {
            return;
        }

        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");

        if (h != 0)//这一个是水平优先  确保不能斜着走,但是因为移动用了rig.MovePosition() 括号里面用了插值移动,所以还是可以稍微斜着走
        {
            v = 0;
        }
        if (h != 0 || v != 0)
        {
            collider.enabled = false;
            RaycastHit2D hit = Physics2D.Linecast(targetPos, targetPos + new Vector2(h, v));//这里判断是否可以移动到下个位置,在目标点和下一个目标点之间发射一条射线
            collider.enabled = true;
            if (hit.transform == null)
            {
                targetPos += new Vector2(h, v);
                restTimer = restTime;
            }
            else
            {
                switch (hit.collider.tag)//如果射到了就进行想要的操作
                {
                    case "OutWall":
                        break;
                    case "Wall":
                        break;
                    default:
                        break;
                }
            }
            restTimer = restTime;
        }  
    }
}

以上这个方法缺点是角色可能会稍微斜着移动 ,因为rig.moveposition 用了插值lerp,插值也是这个

改进 去掉插值和输入控制计时器

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class playCon2 : MonoBehaviour {

    public float smoothing = 10;
    private Vector2 targetPos = new Vector2(1f, 1f);

    private int posx = 1;
    private int posy = 1;

    private Rigidbody2D rig;
    private Collider2D collider;
    //private float restTime = 0.5f;
    //private float restTimer = 1f;//定义一个计时器  多久可以进行一次移动的输入

    private void Awake()
    {
      //  restTimer = restTime;
        rig = GetComponent<Rigidbody2D>();
        collider = GetComponent<Collider2D>();
    }
    //这种方式用于2D控制角色移动的效果  是角色可以斜着走
    private void Update()
    {
        rig.MovePosition( targetPos);
        //restTimer -= Time.deltaTime;
        //if (restTimer >= 0)
        //{
        //    return;
        //}
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");

        if (h != 0)//这一个是水平优先  确保不能斜着走,但是因为移动用了rig.MovePosition() 括号里面用了插值移动,所以还是可以稍微斜着走
        {
            v = 0;
        }

        if (h != 0 || v != 0)
        {
            collider.enabled = false;
            RaycastHit2D hit = Physics2D.Linecast(targetPos, targetPos + new Vector2(h, v));//这里判断是否可以移动到下个位置,在目标点和下一个目标点之间发射一条射线
            collider.enabled = true;
            if (hit.transform == null)
            {
                targetPos += new Vector2(h, v);
            // restTimer = restTime;
            }
            else
            {
                switch (hit.collider.tag)//如果射到了就进行想要的操作
                {
                    case "OutWall":
                        break;
                    case "Wall":
                        break;
                    default:
                        break;
                }
            }
       //restTimer = restTime;
        }
    }
}

改进之后角色可以上下左右移动 但是就是没有插值移动

移动也可以使用transform.translate 这种写法,下面就是利用transform.translate 进行移动,然后利用射线判断是否可以继续往下走,而不是用unity自带的刚体碰撞进行阻挡判断

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class playCon2 : MonoBehaviour {

    public float smoothing = 10;
    private Vector2 targetPos = new Vector2(1f, 1f);

    private int posx = 1;
    private int posy = 1;

    private Rigidbody2D rig;
    private Collider2D collider;


    private void Awake()
    {

        rig = GetComponent<Rigidbody2D>();
        collider = GetComponent<Collider2D>();
    }
    private void Update()
    {

        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");

        if (h != 0)//这一个是水平优先  确保不能斜着走
        {
            v = 0;
        }
        if (h != 0 || v != 0)
        {
            collider.enabled = false;
            RaycastHit2D hit = Physics2D.Raycast(transform.position,  new Vector3(h, v, 0),0.5f);//这里判断是否可以移动到下个位置,在目标点和下一个目标点之间发射一条射线
            Debug.DrawRay(transform.position, new Vector3(h, v, 0).normalized * 0.1f, Color.red, 2f);
            // RaycastHit2D hit = Physics2D.Linecast(transform.position, transform.position + new Vector3(h, v ,0));//这里判断是否可以移动到下个位置,在目标点和下一个目标点之间发射一条射线
            collider.enabled = true;
            if (hit.transform == null)
            {
             transform.Translate(Vector3.right * h * Time.deltaTime + Vector3.up * v * Time.deltaTime);//没有碰撞到物体就继续移动           
            }
            else
            {
                switch (hit.collider.tag)//如果射到了就进行想要的操作
                {
                    case "OutWall":
                        break;
                    case "Wall":
                        break;
                    default:
                        break;
                }
            }

        }

    }
}

最后一种就是简单的利用unity 刚体+碰撞体进行移动控制 和 transform.Translate

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class playercon3 : MonoBehaviour {

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {


        float h = Input.GetAxis("Horizontal");
        transform.Translate(transform.right * h*Time.deltaTime);


        //中间写其他想要的功能代码

        if (h != 0)//水平移动优先
        {
            return;
        }
        float v = Input.GetAxis("Vertical");
        transform.Translate(transform.up * v * Time.deltaTime);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值