DoTa、LOL类游戏转移视角及角色移动

目前DoTa、LOL类似游戏火遍大街小巷,连手机上也出现了一批王者荣耀、自由之战这样类似的游戏,玩家移动靠鼠标点击,在有限的地图内来回切换,具有战略意义及操作结为一体,从而深受大众好评,今天就带大家模仿一下这类游戏的地图鸟瞰的视角转移以及游戏角色的移动。
首先我们需要了解一下摄像机:
摄像机分为透视摄像机和正交摄像机,顾名思义,透视摄像机就如我们人眼看到的实物一样,符合近大远小的规律,而正交摄像机则是还原实物本来面目,在镜头内将事物原本的大小完完全全的呈现出来,在游戏中通常我们以玩家视角使用透视摄像机,小地图使用正交摄像机,这篇博客主要讲的是如何让透视摄像机进行移动达到视角转移的效果。
DoTa、LOL类游戏转移视角及角色移动_第1张图片
如图所示,将两台摄像机分屏显示,模拟LOL场景,将鼠标往右边滑动,透视摄像机将会随之移动,将右边的画面展现出来,需要以下代码实现:

    public float speed;//移动速度
    public float ambit;//判定范围界限
    void Update () {
        //生成一个位置  为  将(获取的鼠标的位置的)屏幕坐标系向摄像机视口的单位化坐标系转换
        Vector3 v1 = Camera.main.ScreenToViewportPoint(Input.mousePosition);
        //判定当鼠标移动到规定范围外就让摄像机进行移动,以世界坐标轴为单位。
        if (v1.x < ambit)// X的坐标最小值,即屏幕左侧
        {
            transform.Translate(Vector3.left * speed * Time.deltaTime, Space.World);
        }
        if (v1.x > 1 - ambit)// X的坐标最大值,即屏幕左侧
        {
            transform.Translate(Vector3.right * speed * Time.deltaTime, Space.World);
        }
        if (v1.y < ambit)// Y的坐标最小值,即屏幕下方
        {
            transform.Translate(Vector3.back * speed * Time.deltaTime, Space.World);
        }
        if (v1.y > 1 - ambit)// Y的坐标最大值,即屏幕上方
        {
            transform.Translate(Vector3.forward * speed * Time.deltaTime, Space.World);
        }
 }

接下来是角色的移动,使用NavMesh(导航网格)在烘焙过的网格中让角色对鼠标点击的地方进行自动寻路:

    private NavMeshAgent agent;//创建一个导航组件
    public GameObject player;//创建一个游戏对象
    public GameObject flower;//方便查看制作一个点击效果
    void Start () {
        //在要移动的对象Player上获取组件
        agent = player.GetComponent();
    }
    void Update () {
        //创建一个从摄像机发出的射线,位置为鼠标的位置
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;//鼠标点击
        if (Physics.Raycast(ray, out hit))
        {
            //获取鼠标右键按键
            if (Input.GetMouseButtonDown(1))
            {
                //克隆点击效果,0.6秒后消失
                GameObject flowers = Instantiate(flower, new Vector3(hit.point.x, agent.transform.position.y, hit.point.z), flower.transform.rotation)as GameObject;
                Destroy(flowers, 0.6f);
                //寻路系统开启,目标位置为鼠标点击的XYZ轴
                agent.SetDestination(new Vector3(hit.point.x, agent.transform.position.y, hit.point.z));
            }
        }

好啦让小龙移动起来吧!

我是博主小磊,欢迎关注、分享、丢香蕉给我哟~~

你可能感兴趣的:(角色互动)