游戏剖析与实现 之 《月圆之夜》

最近准备开一系列自己喜欢的游戏的技术剖析以及实现,没有任何对原著的恶意,只是想思考下成功的作品怎么实现的,如果有好游戏也可以推荐我玩下,前提是有意思的耐玩的游戏

这里写图片描述

首先这个独立游戏没有其他啥界面,难点基本上也在战斗这里,数值方面不做考虑,毕竟我不是策划。这里列一下游戏的难点

牌的生成策略和摆放规则

牌的生成是一个扇形的效果,并且会随着牌的打出或者增加自动重新布局。unity 给我们提供了一个叫球形插值的功能,所以我们利用起来后,这个功能就几句话的节奏。这里我们以原点作为参考

效果:这里写图片描述

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

public class TestCommand : MonoBehaviour {
    public int count;
    //扇形的起点和结束点,决定了开口大小
    Vector3 start = new Vector3(-3, 1, 0); 
    Vector3 end = new Vector3(3, 1, 0);

    private void OnDrawGizmos()
    {
        for (int i = 1; i < count; i++)
        {

            Gizmos.color = Color.red;
            float lerpVaule = (float)1f / count;
             //弧形插值
            Vector3 offset = Vector3.Slerp(start, end, i * lerpVaule);
            Gizmos.DrawLine(Vector3.zero, offset);
        }
    }

}
牌的选取和拖动效果

卡牌的选取放大,移动我这里就不写了,现成的DoTween,ITween插件各种DoMove,DoScale 很容易就搞定了,这里只需要注意坐标转换即可。
UGUI 坐标和屏幕坐标的转换Unity也很贴心的给我们做了工具,这里你可以去自己转换一下也可以直接用我这里的转

        public void OnDrag(PointerEventData eventData)
        {
            Vector2 uipos = Vector2.one;
            RectTransformUtility.ScreenPointToLocalPointInRectangle(
                canvas.transform as RectTransform, 
                Input.mousePosition, 
                canvas.worldCamera, 
                out uipos);
            rt.pivot.Set(0f, 0f);
            rt.anchoredPosition = uipos;
            rt.eulerAngles = Vector3.zero;
            rt.localScale = new Vector3(0.5f, 0.5f, 1);
        }

目前游戏的技术上的难点就在这里啦,后面一篇补一个表现上的难点。
对球形插值不是很了解的,可以参考下这篇文章

猜你喜欢

转载自blog.csdn.net/pdw_jsp/article/details/80313467