开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2213

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 2184|回复: 39

[士郎] FPS实战之破片手榴弹

[复制链接]  [移动端链接]
排名
3
昨日变化

6378

主题

6892

帖子

2万

积分

Rank: 16

UID
1231
好友
185
蛮牛币
2781
威望
30
注册时间
2013-7-29
在线时间
3267 小时
最后登录
2018-5-25

社区QQ达人活力之星原创精华达人突出贡献奖财富之证游戏蛮牛QQ群会员蛮牛妹VIP

发表于 2018-4-24 16:15:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
昨天玩吃鸡,在决赛圈的时候扔手雷不小心把女神给炸死了,求生欲望使我下定决心要好好练手雷。
于是今天我花了些许时间写了一个吃鸡中手雷的实现项目,打算好好练习,在这里也跟大家分享一下,主要是难点在于你是否把高中的物理知识还给老师而已.
项目是在前面的基础上去拓展开发的,没有项目的同学可以关注公众号去拿.

在这里先实现扔手雷的方法
首先在我们的Player下面创建一个球当作手雷.(别问为什么不用模型,还不是穷跟没时间)
然后把位置调好.

接下来给他添加一个刚体.这次手雷的实现我们用Unity的物理引擎来做就可以了.
1.jpg
Mass是质量Drag是阻力,UseGravity是使用重力

几个参数设置好,不然等下跟我们的轨迹会有偏差.
然后帮手雷搞一个脚本. 定义几个变量.
2.jpg
第一个变量是我们轨迹的脚本,等下再创建,这里你先不用管。第二个是手雷他老爸,也是我们前面经常用到的Player,第三个ExplosiveTime是爆炸时间。第四个rig是他自身携带的刚体。第五个velocity是他投出去的初速度.



弄完之后把脚本给他搞上去,把值都赋好


3.jpg

然后,写一个扔手雷的方法.


[AppleScript] 纯文本查看 复制代码
 void AntitankGrenadeOut()
    {
        line.gameObject.SetActive(false);
        float _n = velocity / Time.fixedDeltaTime;
        float _angleY = Mathf.Deg2Rad * -player.localEulerAngles.x;
        float _angleX = Mathf.Deg2Rad * player.localEulerAngles.y;
        Vector3 _force = new Vector3(_n * Mathf.Cos(_angleY) * Mathf.Sin(_angleX),
            _n * Mathf.Sin(_angleY), 
            _n * Mathf.Cos(_angleY) * Mathf.Cos(_angleX));
        rig.AddForce(_force);
        rig.useGravity = true;
        this.transform.SetParent(null);
        StartCoroutine(Explosive());
    }


Line就是我们的轨迹线的脚本,手雷扔出去的时候就把轨迹线去掉.
然后打开我们的高一物体课本!找到牛顿, 把他的牛顿力学公式抄下来

F*T = MV;
在这里我们要求出他的F,

M是我们的刚体质量,刚刚设置了1那个,
V是我们的初速度velocity,
T就是我们物理刷新帧速率更新的时间Time.fixedDeltaTime,
由F=MV/T, 套入我们的参数就是得到的就是n了.
然后在去给他做垂直方向跟水平方向上力的分解.
同样抄他老牛的公式
4.jpg

在这里的随手画一张图,看得懂最好,看不懂就去老牛的书里找一找吧,嘿嘿嘿.
如图oc 跟面aob的夹角就是垂直夹角.

V垂直 = _n * Sin(垂直夹角), --在这里要用到弧度,
V水平= _n * Cos(垂直夹角)
所以用Mathf.Deg2Rad * 夹角,就可以得到了垂直夹角弧度 _angleY;
(因为项目坐标系问题,我这里的垂直方向是player的x角度,你们就找那个上下动的那个角就可以了)
然后再对我们的水平方向的力进行一个分解.因为我们是三维的.所以就是去水平方向的夹角
然后得到我们的水平夹角_angleX;

图中AOD就是水平面的夹角.

(讲的再简单粗暴一点就是你那个摄像机,左右转的角度就是水平夹角,上下晃的就是垂直夹角。)
最后把值套入公式算出力的三个方向的值就可以

Fx = _n * Mathf.Cos(_angleY) * Mathf.Sin(_angleX); //先算出水平面分到了力,再算出水平面上分量x的力.
Fy= _n * Mathf.Cos(_angleY);
Fz = _n * Mathf.Cos(_angleY) * Mathf.Cos(_angleX);

最后把力用一个三维向量_force存起来;

最后用刚体AddForce(_force),这个方法把算出来的力施加在刚体即可.
然后把重力打开.然后把手雷从他老豆身上拿出来, SetParent(null),

因为扔出去的手雷已经不会再跟着人物移动了.
然后打开他的引爆机制,开启协程Explosive(),协程定义如下
[AppleScript] 纯文本查看 复制代码
  IEnumerator Explosive()
    {
        yield return new WaitForSeconds(ExplosiveTime);
        transform.GetChild(0).gameObject.SetActive(true);
        yield return new WaitForSeconds(0.7f);
        transform.gameObject.SetActive(false);
    }

等待爆炸时间ExplosiveTime一到,把手雷下面的爆炸特效打开即可,特效播完把手雷隐藏起来.
然后接下来就来写我们的轨迹线,
毕竟轨迹都没有你扔个鸟哦.
5.jpg
建一个obj,给他加上LineRenderer这个控件.
6.jpg

大小跟颜色自己随缘设置,建议大小弄小一点,不然他又粗又大。

弄完之后创建一个脚本.AntitankGrenade.搞几个变量,

[AppleScript] 纯文本查看 复制代码
 public Transform player;
    public Transform antitank;
    LineRenderer line;
    public int count;
    float g;
    float mVelocity;

Antitank是手雷。

Line是他身上那个线的控件,

count是线的分段数量,设置越多分得越平滑.

g就是Unity里面设置的重力,
mVelocity是我们的初速度.
把值赋好.
[AppleScript] 纯文本查看 复制代码
private void Awake()
    {
        line = GetComponent<LineRenderer>();
        g = Mathf.Abs(Physics.gravity.y);
    }

接下来创建一个方法开启我们的轨迹,
[AppleScript] 纯文本查看 复制代码
 public void CallRendererLine(float _velocity)[/size][/font][/align][align=left][font=微软雅黑][size=3]    {
        mVelocity = _velocity;
        line.SetVertexCount(count + 1);
        line.SetPositions(CalculatePostion());
    }

line.SetVertexCount()为设置线段数量
line.SetPositions()//为设置线段的位置.
CalculatePostion()为计算线段位置的方法,方法如下
[AppleScript] 纯文本查看 复制代码
 Vector3[] CalculatePostion()
    {
        Vector3[] _array = new Vector3[count + 1];
        float _radianAngle;
        _radianAngle = Mathf.Deg2Rad * -player.localEulerAngles.x;
        for(int i = 0; i <= count; i++)
        {
            float _t = (float)i / count;
            _array = CalulatePoint(_t, _radianAngle);
        }
        return _array;
    }

[AppleScript] 纯文本查看 复制代码
_radianAngle就是我们刚刚说的夹角.

然后定义一个循环做一个插值效果,把我们的轨迹分为count+1段,然后通过CalulatePoint()方法去求出每段的位置,最后储存在_array[]里面返回出去。

CalulatePoint()方法如下

[AppleScript] 纯文本查看 复制代码
 Vector3 CalulatePoint(float _t,float _radianAngle)
    {
        float _y = mVelocity * Mathf.Sin(_radianAngle) * _t - 1/2f * g * _t *_t;
        float _x = mVelocity * Mathf.Cos(_radianAngle) * _t * Mathf.Sin(player.localEulerAngles.y * Mathf.Deg2Rad);
        float _z = mVelocity * Mathf.Cos(_radianAngle) * _t * Mathf.Cos(player.localEulerAngles.y * Mathf.Deg2Rad);
        return (new Vector3(_x, _y, _z) + antitank.position);  
    }        


因为我们的手雷在轨迹上只受到一个重力影响.
所以水平方向是恒力.

求距离公式为 S垂直 = vt - 1/2gt*t;
S水平 =Vt,.
最后把这条轨迹加上手雷的坐标移到我们的手雷上面即可.
逻辑就是这样了,
最后可以创建多一个物理材质,给我们的手雷,设置摩擦系数跟弹力系数,然它更加物理化一些。
1.1.gif
7.jpg

Dynamic Friction为动态摩擦力,Static Friction为静态摩擦力,Bounciness会弹力

最后回到我们第一个脚本.在Update()里面监听调用即可,
[AppleScript] 纯文本查看 复制代码
void Update () {[/size][/font][/align]
[font=微软雅黑][size=3][align=left]        if (Input.GetMouseButton(0))[/align]
[align=left]        {[/align]
[align=left]            line.CallRendererLine(velocity);[/align]
[align=left]        }[/align]
[align=left]        if (Input.GetMouseButtonUp(0))[/align]
[align=left]        {[/align]
[align=left]            AntitankGrenadeOut();[/align]
[align=left]        }[/align]
[/size][/font][/align][align=center][align=left][font=微软雅黑][size=3]        }

最终的实现效果:
1.2.gif
知乎@代码律动





跟我念“站长妹纸萌萌哒!”我说站长,你说YO!爱你们么么哒~
回复

使用道具 举报

7日久生情
4499/5000
排名
242
昨日变化
2

59

主题

740

帖子

4499

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
120040
好友
0
蛮牛币
3634
威望
0
注册时间
2015-8-28
在线时间
1880 小时
最后登录
2018-5-26
发表于 2018-4-24 17:07:49 | 显示全部楼层
显然,女神是生产力第一促进要素……

回复 支持 1 反对 0

使用道具 举报

7日久生情
2692/5000
排名
2953
昨日变化
16

0

主题

1888

帖子

2692

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
219676
好友
0
蛮牛币
2488
威望
0
注册时间
2017-7-12
在线时间
370 小时
最后登录
2018-5-26

活力之星

发表于 2018-4-24 18:14:32 | 显示全部楼层
谢谢分享

回复

使用道具 举报

7日久生情
1793/5000
排名
914
昨日变化
1

6

主题

283

帖子

1793

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
880
好友
9
蛮牛币
1759
威望
10
注册时间
2013-7-15
在线时间
474 小时
最后登录
2018-5-21
发表于 2018-4-24 18:33:19 | 显示全部楼层
女神知道了你这么努力,然后就再也没找过你吃鸡

评分

参与人数 1鲜花 +5 收起 理由
shangshentoy + 5

查看全部评分


回复 支持 2 反对 0

使用道具 举报

4四处流浪
489/500
排名
3916
昨日变化

0

主题

34

帖子

489

积分

Rank: 4

UID
231194
好友
0
蛮牛币
1596
威望
0
注册时间
2017-7-10
在线时间
128 小时
最后登录
2018-5-26
发表于 2018-4-25 08:26:37 | 显示全部楼层
谢谢分享

回复

使用道具 举报

7日久生情
2163/5000
排名
912
昨日变化
1

8

主题

284

帖子

2163

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
188595
好友
1
蛮牛币
7871
威望
0
注册时间
2016-12-1
在线时间
815 小时
最后登录
2018-5-27
发表于 2018-4-25 08:27:00 | 显示全部楼层
666666666高手就是吊

回复 支持 反对

使用道具 举报

3偶尔光临
223/300
排名
8333
昨日变化
1

0

主题

57

帖子

223

积分

Rank: 3Rank: 3Rank: 3

UID
270137
好友
2
蛮牛币
518
威望
0
注册时间
2018-3-1
在线时间
42 小时
最后登录
2018-5-25
发表于 2018-4-25 08:31:01 | 显示全部楼层

回复

使用道具 举报

5熟悉之中
644/1000
排名
3046
昨日变化
2

1

主题

57

帖子

644

积分

Rank: 5Rank: 5

UID
224978
好友
0
蛮牛币
2823
威望
0
注册时间
2017-6-3
在线时间
162 小时
最后登录
2018-5-23
发表于 2018-4-25 08:37:17 | 显示全部楼层

回复

使用道具 举报

3偶尔光临
206/300
排名
9165
昨日变化
1

3

主题

47

帖子

206

积分

Rank: 3Rank: 3Rank: 3

UID
254117
好友
4
蛮牛币
1582
威望
0
注册时间
2017-11-13
在线时间
58 小时
最后登录
2018-5-4
发表于 2018-4-25 08:39:41 | 显示全部楼层
很秀哦!

回复

使用道具 举报

3偶尔光临
232/300
排名
8596
昨日变化
6

0

主题

21

帖子

232

积分

Rank: 3Rank: 3Rank: 3

UID
238078
好友
0
蛮牛币
430
威望
0
注册时间
2017-8-17
在线时间
91 小时
最后登录
2018-5-25
发表于 2018-4-25 08:44:53 | 显示全部楼层
哪里可以关注到公众号啊

回复 支持 反对

使用道具 举报

5熟悉之中
763/1000
排名
5744
昨日变化

0

主题

403

帖子

763

积分

Rank: 5Rank: 5

UID
146677
好友
9
蛮牛币
2571
威望
0
注册时间
2016-4-25
在线时间
152 小时
最后登录
2018-5-19
QQ
发表于 2018-4-25 09:05:41 | 显示全部楼层
把女神给炸死了,晚上不会被吸干吗?

回复 支持 反对

使用道具 举报

3偶尔光临
224/300
排名
9625
昨日变化
2

0

主题

73

帖子

224

积分

Rank: 3Rank: 3Rank: 3

UID
267103
好友
0
蛮牛币
464
威望
0
注册时间
2018-1-31
在线时间
53 小时
最后登录
2018-5-25
发表于 2018-4-25 09:08:08 | 显示全部楼层

回复

使用道具 举报

4四处流浪
482/500
排名
4486
昨日变化
23

1

主题

35

帖子

482

积分

Rank: 4

UID
230664
好友
2
蛮牛币
821
威望
0
注册时间
2017-7-6
在线时间
164 小时
最后登录
2018-5-26
发表于 2018-4-25 09:34:17 | 显示全部楼层
陈独秀同志,请你坐下

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1069/1500
排名
3767
昨日变化

0

主题

452

帖子

1069

积分

Rank: 6Rank: 6Rank: 6

UID
182268
好友
2
蛮牛币
984
威望
0
注册时间
2016-11-9
在线时间
275 小时
最后登录
2018-5-25
发表于 2018-4-25 09:40:39 | 显示全部楼层
陈独秀同志,请你坐下

回复 支持 1 反对 0

使用道具 举报

5熟悉之中
995/1000
排名
3652
昨日变化
14

8

主题

413

帖子

995

积分

Rank: 5Rank: 5

UID
214924
好友
2
蛮牛币
2350
威望
0
注册时间
2017-3-28
在线时间
218 小时
最后登录
2018-5-26
发表于 2018-4-25 10:02:14 | 显示全部楼层
自从因为女神迷上了做项目,就把她给忘了

回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

关闭

站长推荐 上一条 /1 下一条

快速回复 返回顶部 返回列表