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

扫一扫,访问微社区

问答求助

关注:489

当前位置:游戏蛮牛 技术专区 问答求助

_____________________________________________________________________________________________________________
问答求助版块规则:

  1、问题尽量描述清楚
      2、代码要放在代码块里
      3、附件最好放到云盘,然后把链接放到TXT文档里,上传TXT文档。【最好没有附件,你懂得】
      4、本版块回复不得无意义,如:顶、呵呵、不错......以及擦边!【真的会扣分的哦】严重者,封IP!
      5、问题得到解决,请选择最佳答案。
      6、若问题是你自己解决了,可以联系管理员,返还蛮牛币,写下你的答案,另有蛮牛币奖赏。
_____________________________________________________________________________________________________________
查看: 959|回复: 7

[技术讨论] 碰撞墙壁后 子弹反弹 方向问题

[复制链接]  [移动端链接]
7日久生情
1959/5000
排名
586
昨日变化
2

8

主题

205

帖子

1959

积分

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

UID
7707
好友
7
蛮牛币
3520
威望
0
注册时间
2013-11-10
在线时间
562 小时
最后登录
2017-12-5
QQ
发表于 2017-10-11 21:08:53 | 显示全部楼层 |阅读模式
300蛮牛币
看到一篇文章说道,子弹碰撞遮挡物反弹的实例,测试可以正常使用:
[C#] 纯文本查看 复制代码
  private Vector3 m_preVelocity = Vector3.zero;//上一帧速度

    public void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.name == "wall")
        {
            ContactPoint contactPoint = collision.contacts[0];
            Vector3 newDir = Vector3.zero;
            Vector3 curDir = transform.TransformDirection(Vector3.forward);
            newDir = Vector3.Reflect(curDir, contactPoint.normal);
            Quaternion rotation = Quaternion.FromToRotation(Vector3.forward, newDir);
            transform.rotation = rotation;
            rigidbody.velocity = transform.forward * speed;  
        }
    }



但是因为需要,我把它放到OnTriggerEnter中,通过子弹OnEnable函数时候发射一条射线来检测是否碰撞到墙壁,结果子弹碰撞墙壁后改变的方向就错了

[C#] 纯文本查看 复制代码
    public void OnTriggerEnter(Collider collider)
    {
   
        if (collider.transform.CompareTag("EmptyWall"))
        {
            _collisonTimes++;
    
            Vector3 newDir = Vector3.zero;
         //   Vector3 curDir = transform.TransformDirection(Vector3.forward);
            newDir = Vector3.Reflect(hit.point, hitNormal);
            Quaternion rotation = Quaternion.FromToRotation(hit.point, newDir);
            transform.rotation = rotation;
            _rigidbody.velocity = transform.forward * speed;  
        }
    }




回复

使用道具 举报

7日久生情
2610/5000
排名
331
昨日变化

4

主题

357

帖子

2610

积分

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

UID
30555
好友
2
蛮牛币
5420
威望
0
注册时间
2014-6-20
在线时间
753 小时
最后登录
2017-12-12
发表于 2017-10-11 21:08:54 | 显示全部楼层
1) 我觉得应该在Trigger里面碰触到再发射射线
2) 应该有个防止再次检测的判断吧,不然就会有多个力了.

评分

参与人数 1鲜花 +5 收起 理由
xuyin58 + 5 很给力!

查看全部评分


回复

使用道具 举报

7日久生情
1959/5000
排名
586
昨日变化
2

8

主题

205

帖子

1959

积分

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

UID
7707
好友
7
蛮牛币
3520
威望
0
注册时间
2013-11-10
在线时间
562 小时
最后登录
2017-12-5
QQ
 楼主| 发表于 2017-10-11 21:10:17 | 显示全部楼层
    RaycastHit hit;     void OnEnable() {             Physics.Raycast(transform.position, transform.forward, out hit, 100f);}

回复

使用道具 举报

7日久生情
1959/5000
排名
586
昨日变化
2

8

主题

205

帖子

1959

积分

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

UID
7707
好友
7
蛮牛币
3520
威望
0
注册时间
2013-11-10
在线时间
562 小时
最后登录
2017-12-5
QQ
 楼主| 发表于 2017-10-12 11:44:54 | 显示全部楼层
heartzwh 发表于 2017-10-12 10:00
1) 我觉得应该在Trigger里面碰触到再发射射线
2) 应该有个防止再次检测的判断吧,不然就会有多个力了. ...

谢谢你的回复,刚测试下还是有些问题,主要根源是我数学这块太薄弱了

回复

使用道具 举报

7日久生情
2610/5000
排名
331
昨日变化

4

主题

357

帖子

2610

积分

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

UID
30555
好友
2
蛮牛币
5420
威望
0
注册时间
2014-6-20
在线时间
753 小时
最后登录
2017-12-12
发表于 2017-10-12 11:51:58 | 显示全部楼层
xuyin58 发表于 2017-10-12 11:44
谢谢你的回复,刚测试下还是有些问题,主要根源是我数学这块太薄弱了

还有什么问题?能截图对比下运行游戏时哪里不一样?
[发帖际遇]: heartzwh 乐于助人,奖励 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

7日久生情
1959/5000
排名
586
昨日变化
2

8

主题

205

帖子

1959

积分

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

UID
7707
好友
7
蛮牛币
3520
威望
0
注册时间
2013-11-10
在线时间
562 小时
最后登录
2017-12-5
QQ
 楼主| 发表于 2017-10-12 15:16:30 | 显示全部楼层
heartzwh 发表于 2017-10-12 11:51
还有什么问题?能截图对比下运行游戏时哪里不一样?

现在碰撞墙壁后子弹原路返回了.没有根据碰撞点的法线去走反射那个方向走,下边是我的代码:

[C#] 纯文本查看 复制代码
public void OnTriggerEnter(Collider collider)
    {
     

        if (collider.transform.CompareTag("EmptyWall"))
        {
          
            _collisonTimes++;
    RaycastHit hit;
            Physics.Raycast(transform.position, transform.forward, out hit, 100f);
            Vector3 newDir = Vector3.zero;
            Vector3 curDir = transform.InverseTransformDirection(Vector3.forward);
            newDir = Vector3.Reflect(curDir, hit.normal);
            Quaternion rotation = Quaternion.FromToRotation(Vector3.forward, newDir);
            transform.rotation = rotation;
            _rigidbody.velocity =transform.forward * speed; 

        }




回复

使用道具 举报

7日久生情
1959/5000
排名
586
昨日变化
2

8

主题

205

帖子

1959

积分

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

UID
7707
好友
7
蛮牛币
3520
威望
0
注册时间
2013-11-10
在线时间
562 小时
最后登录
2017-12-5
QQ
 楼主| 发表于 2017-10-12 15:19:32 | 显示全部楼层
sorry !按照你的方法已经解决了,十分感谢!!
是我把TransformDirection改成InverseTransformDirection导致出错了
[发帖际遇]: xuyin58 在网吧通宵,花了 3 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

排名
13123
昨日变化
11

0

主题

24

帖子

98

积分

Rank: 2Rank: 2

UID
185733
好友
0
蛮牛币
0
威望
0
注册时间
2016-11-22
在线时间
26 小时
最后登录
2017-10-16
发表于 2017-10-16 15:07:42 | 显示全部楼层

回复

使用道具 举报

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

本版积分规则

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