当前位置:网站首页>Unity3D_ Class fishing project, bullet rebound effect is achieved
Unity3D_ Class fishing project, bullet rebound effect is achieved
2022-07-07 15:52:00 【Le_ Sam】
The bullet rebound diagram is as follows :
1. Both the wall and the bullet are collision bodies
2. Prerequisite : You need to know the direction vector of the bullet , Wall direction vector
3. Simple calculation process , Yellow is the bullet direction vector , Calculate the included angle with the wall , Calculate the orange direction vector according to the incident angle equal to the reflection angle . At this time, only the direction of the bullet changed , Next, calculate the offset of the position , According to the angle with the wall and the size of the bullet itself, the trigonometric function sin/cos Calculate the offset , The final effect is like the red arrow .
Code :
-- The bullet bounced ,ColliderObj: Collision wall total 4 Noodles .
-- self.bulletObjLength Estimate the bullet length , self.Dir Is the current direction vector of the bullet , self.o_Transform For example bullets
function BCAmmoBase:ReflectBullet(ColliderObj)
-- inNormal: Wall direction vector , Used to calculate the reflection angle , Is the normal
-- XOrZ: Determine whether the bullet hit the horizontal wall or the vertical wall
-- iden: The sign of the wall where the bullet hit , Used to record the wall of the last collision
local inNormal, XOrZ, iden = nil
if tostring(ColliderObj.transform.name) == "ForwardWall" then
inNormal = Vector3(0, 0, -1)
XOrZ = true
iden = "F"
elseif tostring(ColliderObj.transform.name) == "BackWall" then
inNormal = Vector3(0, 0, 1)
XOrZ = true
iden = "B"
elseif tostring(ColliderObj.transform.name) == "LeftWall" then
inNormal = Vector3(1, 0, 0.1)
XOrZ = false
iden = "L"
elseif tostring(ColliderObj.transform.name) == "RightWall" then
inNormal = Vector3(-1, 0, 0.1)
XOrZ = false
iden = "R"
end
if inNormal == nil or iden == nil then
-- log("inNormal == nil or iden == nil ")
return
end
-- To avoid bullets flying out of the wall , It is forbidden to bounce multiple times on the same wall
if iden == self.collideLastIden then
-- log("iden == self.collideLastIden ")
return
end
self.collideLastIden = iden
self.collideInNormal = inNormal
self.collideXOrZ = XOrZ
local reflexDir = Vector3.Reflect(self.Dir, self.collideInNormal)
local dirAngle = 90 - Vector3.Angle(reflexDir, self.collideInNormal)
local dic = math.sin(math.rad(dirAngle)) * self.bulletObjLength
-- log(tostring(reflexDir) .. " Reflection vector ")
-- log(tostring(dirAngle) .. " The angle between the reflection vector and the position correction ")
-- log(tostring(dic) .. " Position correction ")
-- Position correction
local pos = self.o_Transform.position
if self.collideXOrZ then
self.o_Transform.position = reflexDir.x >= 0 and pos + Vector3(dic, 0, 0) or pos - Vector3(dic, 0, 0)
else
self.o_Transform.position = reflexDir.z >= 0 and pos + Vector3(0, 0, dic) or pos - Vector3(0, 0, dic)
end
-- Direction correction
local dir = Vector3.Normalize(reflexDir)
self.Dir = Vector3(dir.x, 0, dir.z) -- Y The shaft is fixed to 0, Avoid tilting bullets up or down
self.o_Transform.rotation = Quaternion.FromToRotation(Vector3.forward, self.Dir)
end
边栏推荐
- AE learning 02: timeline
- Steps to create P8 certificate and warehousing account
- [quick start for Digital IC Validation] 26. Ahb - sramc (6) for system verilog project practice (Basic Points of APB Protocol)
- OpenGL's distinction and understanding of VAO, VBO and EBO
- Monthly observation of internet medical field in May 2022
- Cocos uses custom material to display problems
- Three. JS introductory learning notes 0: illustration of how webgl and threejs work
- 2022山东智慧养老展,适老穿戴设备展,养老展,山东老博会
- [markdown grammar advanced] make your blog more exciting (IV: set font style and color comparison table)
- Three. JS introductory learning notes 04: external model import - no material obj model
猜你喜欢
Ue4/ue5 multi thread development attachment plug-in download address
Zhongang Mining: Fluorite continues to lead the growth of new energy market
深度之眼(七)——矩阵的初等变换(附:数模一些模型的解释)
无线传感器网络--ZigBee和6LoWPAN
【数字IC验证快速入门】20、SystemVerilog学习之基本语法7(覆盖率驱动...内含实践练习)
[quick start of Digital IC Verification] 18. Basic grammar of SystemVerilog learning 5 (concurrent threads... Including practical exercises)
Introduction of mongod management database method
What is Base64?
【微信小程序】Chapter(5):微信小程序基础API接口
Getting started with webgl (4)
随机推荐
Cocos uses custom material to display problems
Actually changed from 408 to self proposition! 211 North China Electric Power University (Beijing)
深度之眼(七)——矩阵的初等变换(附:数模一些模型的解释)
Android -- jetpack: the difference between livedata setValue and postvalue
Asynchronous application of generator function
C Alibaba cloud OSS file upload, download and other operations (unity is available)
Getting started with webgl (4)
星瑞格数据库入围“2021年度福建省信息技术应用创新典型解决方案”
numpy--数据清洗
Vertex shader to slice shader procedure, varying variable
[quick start of Digital IC Verification] 19. Basic grammar of SystemVerilog learning 6 (thread internal communication... Including practical exercises)
Virtual memory, physical memory /ram what
Ida Pro reverse tool finds the IP and port of the socket server
【数字IC验证快速入门】20、SystemVerilog学习之基本语法7(覆盖率驱动...内含实践练习)
AE learning 02: timeline
Vite path alias @ configuration
Clang compile link ffmpeg FAQ
VS2005 strange breakpoint is invalid or member variable value cannot be viewed
Shipping companies' AI products are mature, standardized and applied on a large scale. CIMC, the global leader in port and shipping AI / container AI, has built a benchmark for international shipping
【花雕体验】15 尝试搭建Beetle ESP32 C3之Arduino开发环境