游戏蛮牛学习群(纯技术交流,不闲聊):539178957
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2286

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

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

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

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

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

6673

主题

7195

帖子

2万

积分

Rank: 16

UID
1231
好友
185
蛮牛币
9021
威望
30
注册时间
2013-7-29
在线时间
3426 小时
最后登录
2018-8-17

社区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日久生情
4843/5000
排名
210
昨日变化

66

主题

788

帖子

4843

积分

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

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

回复 支持 1 反对 0

使用道具 举报

7日久生情
3150/5000
排名
2218
昨日变化
7

0

主题

2101

帖子

3150

积分

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

UID
219676
好友
1
蛮牛币
2424
威望
0
注册时间
2017-7-12
在线时间
465 小时
最后登录
2018-8-17

活力之星

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

回复

使用道具 举报

7日久生情
1801/5000
排名
966
昨日变化

6

主题

283

帖子

1801

积分

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

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

评分

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

查看全部评分


回复 支持 2 反对 0

使用道具 举报

5熟悉之中
691/1000
排名
2997
昨日变化
17

0

主题

54

帖子

691

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

7日久生情
2387/5000
排名
721
昨日变化

8

主题

285

帖子

2387

积分

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

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

回复 支持 反对

使用道具 举报

3偶尔光临
258/300
排名
7553
昨日变化
2

0

主题

57

帖子

258

积分

Rank: 3Rank: 3Rank: 3

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

回复

使用道具 举报

5熟悉之中
659/1000
排名
3153
昨日变化
1

1

主题

59

帖子

659

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

3偶尔光临
241/300
排名
8553
昨日变化
1

3

主题

52

帖子

241

积分

Rank: 3Rank: 3Rank: 3

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

回复

使用道具 举报

4四处流浪
315/500
排名
7284
昨日变化
2

0

主题

28

帖子

315

积分

Rank: 4

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

回复 支持 反对

使用道具 举报

5熟悉之中
837/1000
排名
5385
昨日变化
6

0

主题

433

帖子

837

积分

Rank: 5Rank: 5

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

回复 支持 反对

使用道具 举报

4四处流浪
329/500
排名
6815
昨日变化
45

0

主题

79

帖子

329

积分

Rank: 4

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

回复

使用道具 举报

5熟悉之中
630/1000
排名
3519
昨日变化
20

1

主题

38

帖子

630

积分

Rank: 5Rank: 5

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

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1308/1500
排名
3045
昨日变化
5

0

主题

528

帖子

1308

积分

Rank: 6Rank: 6Rank: 6

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

回复 支持 1 反对 0

使用道具 举报

6蛮牛粉丝
1230/1500
排名
3102
昨日变化
15

10

主题

511

帖子

1230

积分

Rank: 6Rank: 6Rank: 6

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

回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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