RPG 游戏地图卷动简单API

        在传统RPG 游戏中是非常常见的,怎么实现一个简单的地图卷动呢! 其实做法很简单,就是检测何时需要同步相机与角色的XY轴.

【第一步 创建一个scene】 

BigMapBg 场景大地图,  MainCamera 主相机 , role (球体) , ViewBg 可视区域。 更多精彩请点击 狗刨学习网


在 MainCamera 上帮上 TestGame 脚本, 设置 role ,viewPos 预设
下面附上代码

[code]csharpcode:
public class TestGame : MonoBehaviour
{
    public GameObject role;
    public GameObject viewPos;
    private GameRole _gameRole;
    private float _viewPosZ;
    GameObject cameGo;

    void Awake()
    {
        cameGo = GameObject.Find("Main Camera");
        _gameRole = new GameRole(role, cameGo);
        _viewPosZ = viewPos.transform.position.z;
    }

    void Update()
    {
        Vector3 vect = Vector3.zero;

        if (Input.GetKeyDown(KeyCode.W))
            _gameRole.Move(GameRole.MoveType.Up);
        else if (Input.GetKeyDown(KeyCode.A))
            _gameRole.Move(GameRole.MoveType.Left);
        else if (Input.GetKeyDown(KeyCode.D))
            _gameRole.Move(GameRole.MoveType.Right);
        else if (Input.GetKeyDown(KeyCode.S))
            _gameRole.Move(GameRole.MoveType.Down);
       
        //Vector3 cameVect = cameGo.transform.position;
        //cameVect.z = _viewPosZ;

        //viewPos.transform.position = cameVect;
    }

}
API  代码
[code]csharpcode:
public class GameRole
{

    public enum MoveType
    {
        Up,
        Down,
        Left,
        Right
    }

    private GameObject _roleGo;
    private GameObject _cameGo;
    private const float SPEED = 5f;
    public Vector2 max_map = new Vector2(50, 50);
    public Vector2 max_came = new Vector2(30, 30);

    public GameRole(GameObject roleGo, GameObject cameGO)
    {
        _roleGo = roleGo;
        _cameGo = cameGO;
    }

    public void Move(MoveType type)
    {
        Vector3 speed = Vector3.zero;
        switch (type)
        {
            case MoveType.Up:
                speed = new Vector3(0, SPEED, 0);
                break;
            case MoveType.Down:
                speed = new Vector3(0, -SPEED, 0);
                break;
            case MoveType.Left:
                speed = new Vector3(-SPEED, 0, 0);
                break;
            case MoveType.Right:
                speed = new Vector3(SPEED, 0, 0);
                break;
        }

        MoveRole(speed);

        MoveCame(speed);
    }

    /// <summary>
    /// 移动相机
    /// </summary>
    /// <param name="curSpeed"></param>
    private void MoveCame(Vector3 curSpeed)
    {

        Vector3 camePos = _cameGo.transform.position;
        Vector3 rolePos = _roleGo.transform.position;
        rolePos.z = camePos.z;

        Vector3 dVect = rolePos - camePos;
        float dx = max_map.x - Mathf.Abs(dVect.x);     // 角色.x - 地图.x
        float dy = max_map.y - Mathf.Abs(dVect.y);     // 角色.y - 地图.y

        float dxC = max_came.x - Mathf.Abs(rolePos.x);  // 角色.x - 可见区域.x
        float dyC = max_came.y - Mathf.Abs(rolePos.y);  // 角色.y - 可见区域.y


        if (dxC >= 0 && dyC >= 0);                   // x,y 都没达到最大
        else if (dx > 0 && dxC >= 0)                 // x 没有达到最大
            rolePos.y = camePos.y;
        else if (dy > 0 && dyC >= 0)                 // y 轴没有达到最大
            rolePos.x = camePos.x;
        else
            return;

        _cameGo.transform.position = rolePos;
    }

    /// <summary>
    /// 移动角色
    /// </summary>
    /// <param name="curSpeed"></param>
    private void MoveRole(Vector3 curSpeed)
    {
        Vector3 curPos = _roleGo.transform.position;
        Vector3 tagPos = curPos + curSpeed;

        // 在角色可移动区域内
        if (isInRec(tagPos, max_map))
            _roleGo.transform.position = tagPos;
    }

    private bool isInRec(Vector3 pos, Vector2 Rect)
    {
        if (Rect.x - Mathf.Abs(pos.x) >= 0 &&
            Rect.y - Mathf.Abs(pos.y) >= 0)
            return true;
        return false;
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值