惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
O
OpenAI News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
Webroot Blog
Webroot Blog
GbyAI
GbyAI
S
SegmentFault 最新的问题
Cyberwarzone
Cyberwarzone
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
J
Java Code Geeks
Google DeepMind News
Google DeepMind News
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
博客园 - 【当耐特】
S
Secure Thoughts
酷 壳 – CoolShell
酷 壳 – CoolShell
AWS News Blog
AWS News Blog
Engineering at Meta
Engineering at Meta
S
Security Affairs
H
Help Net Security
Microsoft Security Blog
Microsoft Security Blog
D
DataBreaches.Net
云风的 BLOG
云风的 BLOG
Hugging Face - Blog
Hugging Face - Blog
Google DeepMind News
Google DeepMind News
Spread Privacy
Spread Privacy
T
Threatpost
Forbes - Security
Forbes - Security
C
Cisco Blogs
Scott Helme
Scott Helme
Attack and Defense Labs
Attack and Defense Labs
Simon Willison's Weblog
Simon Willison's Weblog
腾讯CDC
The Last Watchdog
The Last Watchdog
Cloudbric
Cloudbric
Last Week in AI
Last Week in AI
Recorded Future
Recorded Future
小众软件
小众软件
V
Vulnerabilities – Threatpost
美团技术团队
人人都是产品经理
人人都是产品经理
有赞技术团队
有赞技术团队
Apple Machine Learning Research
Apple Machine Learning Research
Hacker News - Newest:
Hacker News - Newest: "LLM"
I
Intezer
月光博客
月光博客
C
Cyber Attacks, Cyber Crime and Cyber Security
博客园 - 司徒正美
C
Cybersecurity and Infrastructure Security Agency CISA
Martin Fowler
Martin Fowler
博客园 - 聂微东

博客园 - sun_dust_shadow

(翻译) 延迟补偿方法的协议设计与优化 Latency Compensating Methods in Client/Server In-game Protocol Design and Optimization (翻译) Dota2 Random Distribution Dota2中的随机分布 (个人思考)游戏技能的实现 (读书笔记)平衡掌控者 [瞄准辅助] 实现一种柔和平滑的瞄准辅助 (个人思考)实现游戏GAS系统中的Tag (翻译) Efficiency Tips on Switching Spaces and Transformation Matrices in Unity (翻译) V Rising's Animation Layering in Unity (翻译 unity2020.1) Understanding the managed heap (UnityEditor Tool) 语音控制unity editor暂停和播放 (翻译 ue gas) Gameplay Ability 总结 Overwatch Gameplay Architecture and Netcode 守望先锋的游戏架构与网络代码 (翻译 ) Source Multiplayer Networking Source引擎的多人网路系统 (翻译 gafferongames) Networked Physics in Virtual Reality VR中的网络物理 (翻译 gafferongames) Client Server Connection 客户端服务器连接 (翻译 gafferongames)Reliable Ordered Messages 可靠有序消息 (翻译 gafferongames) Sending Large Blocks of Data 发送大块数据 (翻译 gafferongames) Packet Fragmentation and Reassembly 数据包分片与重组 游戏中Shotgun(喷子)发射子弹的实现
Topdown游戏中Input朝向的转化
sun_dust_shadow · 2025-04-07 · via 博客园 - sun_dust_shadow

前提

在Topdown双摇杆游戏中,我们需要将摇杆输入朝向转到摄像机空间,以实现往前走是往屏幕的前方,往后是往屏幕的后方,而不是原始的输入朝向。

我们只讨论固定视角并且player只有y轴旋转的游戏。

实现

需要进行一个Vector2的映射

 1 private static Vector3 ViewSpaceToGroundSpace(float cameraAngleY, Vector2 vec)
 2 {
 3     float angleRad = -cameraAngleY * Mathf.Deg2Rad;
 4     float cos = Mathf.Cos(angleRad);
 5     float sin = Mathf.Sin(angleRad);
 6 
 7     Vector2 rotated = new Vector2(
 8         vec.x * cos - vec.y * sin,
 9         vec.x * sin + vec.y * cos
10     );
11 
12     return new Vector3(rotated.x, 0f, rotated.y);
13 }

旋转和瞄准

双摇杆下我们需要区分旋转和瞄准的实现。

其中旋转的实现,鼠标和摇杆是一致的

1       private static Vector3 GetMovementInputGroundSpace(Transform camera, int horizontalActionId, int verticalActionId, float deadZone)
2         {
3             var input = InputExtension.GetAxis2D(horizontalActionId, verticalActionId);
4             if (input.sqrMagnitude > 1) input = input.normalized;
5             input = InputExtension.InputWithRadialDeadZone(input.x, input.y, deadZone);
6             return ViewUtils.ViewSpaceToGroundSpace(camera, input).normalized;
7         }

瞄准朝向的获取,鼠标相对复杂一点,需要在开火的水平面做映射

 1         private static Vector3 GetAimInputInGroundSpace(GameEntity gameEntity, Camera camera, int horizontalActionId, int verticalActionId)
 2         {
 3             if (InputExtension.IsKeyboarding())
 4             {
 5                 if (InputExtension.GetButton(InputAction.Aim))
 6                 { 9                     var playerFirePoint = gameEntity.GetObject<WeaponFirePointTag>().Component;
10                     Transform playerTransform = gameEntity.Get<Transform>();
11                     Vector3 refPosition = playerTransform.position;
13                     refPosition.y = playerFirePoint.position.y;
14                     var ray = camera.ScreenPointToRay(InputExtension.MousePosition);
15                     //we need a plane to project the aim direction to the aiming ground : https://forum.unity.com/threads/3rd-person-look-at-mouse-script.1078358/
16                     var aimingPlane = new Plane(Vector3.up, refPosition);
17                     aimingPlane.Raycast(ray, out float distance);
18                     var aimDestDirection = (ray.origin + distance * ray.direction - refPosition).normalized;
19                     var rotation = Quaternion.LookRotation(aimDestDirection);
20                     return rotation * Vector3.forward;
21                 }
22 
23                 return Vector3.zero;
24             }
25 
26             var input = InputExtension.GetAxis2D(horizontalActionId, verticalActionId);
27             return ViewUtils.ViewSpaceToGroundSpace(camera, input).normalized;
28         }