zoukankan      html  css  js  c++  java
  • 在moba游戏里面模拟实现绝地求生毒雾圈功能

    ---恢复内容开始---

    已经有很长一段时间没做项目了上半年大多数时间都荒废在王者荣耀,哈哈,S8赛季也上了王者,美滋滋

    转回正题,公司需要开个新项目,需要把原有的moba游戏,改成类似绝地求生那玩法

    原有moba项目是用unity 做的,本人已经有很长一段时间没接触,颓废哎~~,还好经过几天努力基本熟悉了

    绝地求生游戏 基本玩法就是把100个玩家放到一个荒岛上,每过几分钟岛上就会出现毒雾圈,然后慢慢缩小,

    直到剩下最后一个玩家,就是最后冠军,我目前就是需要实现毒雾圈功能

    首先需要在游戏场景里面放置一个毒雾圈prefab,这个我是从原先项目里面暂时借用的美术资源,毒雾圈开始时候放置在(0,0)位置

    初始化大小 UIEffectItem_Home_Scale = new Vector3(470.0f, 200.0f, 470.0f);//场均毒雾初始大小,

    怎么计算出scale 大小呢,我通过以下代码实现

    在 void OnDrawGizmos() 里面放入以下代码

    // for hs
    Vector3 center = Vector3.zero;
    Gizmos.color = Color.yellow;
    int r = 140;
    for (int i = 0;i < 360;i++)
    {
    float x1 = center.x + r * Mathf.Cos(i * Mathf.PI / 180);
    float z1 = center.z + r * Mathf.Sin(i * Mathf.PI / 180);
    Vector3 pos1 = new Vector3(x1, 0, z1);

    float x2 = center.x + r * Mathf.Cos((i + 1) * Mathf.PI / 180);
    float z2 = center.z + r * Mathf.Sin((i + 1) * Mathf.PI / 180);
    Vector3 pos2 = new Vector3(x2, 0, z2);
    Gizmos.DrawLine(pos1, pos2);
    }

     在场景里面画出毒雾圈(黄色线条),逐步调整 毒雾圈scale场景,得出 缩放比例(470.0f, 200.0f, 470.0f);

    放置好毒雾圈后,还需要显示在小地图上面,原本设想也可以在场景里面放置一个圆圈prefab

    但是碰到一个问题,就是缩放时候会出现圆圈的边缘同时放大,十分困扰,于是问百度说可以用shader画出来

    效果下图,只要设置好画的原点和半径就可以了

    下面就是画圆圈的关键shader代码 

    bool circle(vec2 pos, vec2 center, float radius, float3 color, float antialias) { 
    //float d = length(pos - center) - radius;
    //float t = smoothstep(0, antialias, d);
    //return vec4(color, 1.0 - t);

    if (abs(length(pos - center) - radius) < 2)
    {
    // In the circle
    //return vec4(color, 1.0);
    return true;
    }
    else
    {
    //return vec4(0, 0, 0, 0);
    return false;
    }
    }

    shader学习参考 http://blog.csdn.net/candycat1992/article/details/44039077 多谢这个博主 写得简单明了

    大概学习1天也能基本明白shader怎么写了

     写好shader后,新建一个material 命名为circle.mat 再把shader 拖进入circle.mat

    在场景里面建立一个gameobject 加入image 组件,把circle.mat拖入image组件的material里面。

    UnityEngine.UI.Image image = UIBattleManager.Self.duwucircle.GetComponent<UnityEngine.UI.Image>();

    image.material.SetVector("_safeParameters", new Vector4(center.x, center.y, safe_r * getmapscale(), 10));

    代码里面这样就可以控制shader参数(也是问百度才知道这样写的)

     好了,几个关键步骤都写完了,剩下需要补齐 坐标移动,坐标转动的代码需要读者自己去动手好了

    资料参考

    http://blog.csdn.net/candycat1992/article/details/44039077

    http://blog.csdn.net/candycat1992/article/details/44244549

  • 相关阅读:
    hdu 2680 最短路径(dijkstra算法+多源最短路径单源化求最小值)
    kmp算法
    STP根交换机,指定端口,根端口,阻塞端口
    python,django安装
    交换机access与trunk口
    树状数组
    hdoj 2191(多重背包)
    hdoj 2601(判断N=i*j+i+j)
    二维背包经典问题
    hdoj 2602(背包)
  • 原文地址:https://www.cnblogs.com/maikkk/p/7846890.html
Copyright © 2011-2022 走看看