热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Unity碰撞的例子

1.新建一个3D的Unity工程。2.菜单GameObject-3DObject,选择Cube和Capsule两个物体。在Hierarchy的面板中,拖拽Capsu

1.新建一个3D的Unity工程。

2.菜单 "GameObject" - "3D Object",选择"Cube" 和 "Capsule"两个物体。在Hierarchy的面板中,拖拽Capsule到Cube的物体上。Cube为Capsule的子组件。

3.Hierarhy面板中,选择Cube,在Inspector面板的Transform选项卡,更改两个属性:Position和Scale。Cube重命名为"Visor"。

  • Set the Visor GameObject’s Scale to (0.95, 0.25, 0.5).
  • Set the Visor GameObject’s Position to: (0.0, 0.5, 0.24)

  在Project面板,右键Assets目录,"Create" - "Material" ,创建一个材质,命名为Black。选中,在Inspector面板的"Shader "- "Unit/Color"中,更改材质颜色为黑色。拖拽到Hierarchy面板的Cube对象上。

4.拖拽Hierarchy面板中的Capsule到Project面板的Assets目录下,生成一个预制件,重命名为Player,模仿玩家对象。删除Hierarchy面板的Cube。

5.拖拽Player预制件到Hierarchy面板中两次,分别命名为"Player1"和"Player2"。

6.在Assets目录中,新建一个scripts文件夹,右键"Create" - "C# Scripts ",新建两个脚本文件,分别命名为"Player1"和"Player2"。 两个脚本的代码如下:

技术分享技术分享
 1 using UnityEngine;
 2 using System.Collections;
 3 
 4 public class Player1 : MonoBehaviour {
 5 
 6     public static bool selected = true;
 7     public int translateSpeed=1;
 8     public int rotateSpeed = 10;
 9 
10     // Use this for initialization
11     void Start () {
12         
13     }
14     
15     // Update is called once per frame
16     void Update () {
17         if (Input.GetKeyDown (KeyCode.P)) {
18             selected = !selected;
19         }
20     }
21 
22     void OnGUI(){
23         if (selected) {
24             // turn left
25             if (Input.GetKey (KeyCode.A)) {
26                 transform.Translate (Vector3.left * Time.deltaTime);
27             }
28 
29             // turn right
30             if (Input.GetKey (KeyCode.D)) {
31                 transform.Translate (Vector3.right * Time.deltaTime);
32             }
33 
34             // turn forward
35             if (Input.GetKey (KeyCode.W)) {
36                 transform.Translate (Vector3.forward * Time.deltaTime);
37             }
38 
39             // turn backward
40             if (Input.GetKey (KeyCode.S)) {
41                 transform.Translate (Vector3.back * Time.deltaTime);
42             }
43 
44             // turn up
45             if (Input.GetKey (KeyCode.Q)) {
46                 transform.Translate (Vector3.up * Time.deltaTime);
47             }
48 
49             // turn down
50             if (Input.GetKey (KeyCode.E)) {
51                 transform.Translate (Vector3.down * Time.deltaTime);
52             }                    
53 
54             // rotate x axis anticlockwise
55             if (Input.GetKey (KeyCode.H)) {
56                 transform.Rotate (Vector3.left * Time.deltaTime * rotateSpeed);
57             }
58 
59             // rotate x axis clockwise
60             if (Input.GetKey (KeyCode.K)) {
61                 transform.Rotate (Vector3.right * Time.deltaTime * rotateSpeed);
62             }
63 
64             // rotate z axis clockwise
65             if (Input.GetKey (KeyCode.U)) {
66                 transform.Rotate (Vector3.forward * Time.deltaTime * rotateSpeed);
67             }
68 
69             // rotate z axis anticlockwise
70             if (Input.GetKey (KeyCode.J)) {
71                 transform.Rotate (Vector3.back * Time.deltaTime * rotateSpeed);
72             }
73 
74             // rotate y axis clockwise
75             if (Input.GetKey (KeyCode.Y)) {
76                 transform.Rotate (Vector3.up * Time.deltaTime * rotateSpeed);
77             }
78 
79             // rotate y axis anticlokcwise
80             if (Input.GetKey (KeyCode.I)) {
81                 transform.Rotate (Vector3.down * Time.deltaTime * rotateSpeed);
82             }
83         }
84     }
85 }
Player1
技术分享技术分享
 1 using UnityEngine;
 2 using System.Collections;
 3 
 4 public class Player2 : MonoBehaviour {
 5 
 6     public int translateSpeed=1;
 7     public int rotateSpeed = 10;
 8 
 9     // Use this for initialization
10     void Start () {
11     
12     }
13     
14     // Update is called once per frame
15     void Update () {
16     
17     }
18 
19     void OnGUI(){
20         if (!Player1.selected) {
21             // turn left : x- axis
22             if (Input.GetKey (KeyCode.A)) {
23                 transform.Translate (Vector3.left * Time.deltaTime);
24             }
25 
26             // turn right : x+ axis
27             if (Input.GetKey (KeyCode.D)) {
28                 transform.Translate (Vector3.right * Time.deltaTime);
29             }
30 
31             // turn forward : z+ axis
32             if (Input.GetKey (KeyCode.W)) {
33                 transform.Translate (Vector3.forward * Time.deltaTime);
34             }
35 
36             // turn backward : z- axis
37             if (Input.GetKey (KeyCode.S)) {
38                 transform.Translate (Vector3.back * Time.deltaTime);
39             }
40 
41             // turn up : y+ axis
42             if (Input.GetKey (KeyCode.Q)) {
43                 transform.Translate (Vector3.up * Time.deltaTime);
44             }
45 
46             // turn down : y- axis
47             if (Input.GetKey (KeyCode.E)) {
48                 transform.Translate (Vector3.down * Time.deltaTime);
49             }                    
50 
51 
52             // rotate x axis anticlockwise
53             if (Input.GetKey (KeyCode.H)) {
54                 transform.Rotate (Vector3.left * Time.deltaTime * rotateSpeed);
55             }
56                 
57             // rotate x axis clockwise
58             if (Input.GetKey (KeyCode.K)) {
59                 transform.Rotate (Vector3.right * Time.deltaTime * rotateSpeed);
60             }
61 
62             // rotate z axis clockwise
63             if (Input.GetKey (KeyCode.U)) {
64                 transform.Rotate (Vector3.forward * Time.deltaTime * rotateSpeed);
65             }
66 
67             // rotate z axis anticlockwise
68             if (Input.GetKey (KeyCode.J)) {
69                 transform.Rotate (Vector3.back * Time.deltaTime * rotateSpeed);
70             }
71 
72             // rotate y axis clockwise
73             if (Input.GetKey (KeyCode.Y)) {
74                 transform.Rotate (Vector3.up * Time.deltaTime * rotateSpeed);
75             }
76 
77             // rotate y axis anticlokcwise
78             if (Input.GetKey (KeyCode.I)) {
79                 transform.Rotate (Vector3.down * Time.deltaTime * rotateSpeed);
80             }
81         }
82 
83     }
84 }
Player2

编辑完两个脚本后,关闭回到unity。

7.分别拖拽两个脚本"Player1"和"Player2"到Hierarchy的对应物体Player1和Player2上。

8.分别选择Hierarhy面板上的Player1和Player2物体,选择菜单 "Component" - "Physical" -- "RigidBody",为物体增加碰撞属性。

9.保存,运行。

"ADWSQE"  -- "左右前后上下"

"P"  -- 控制是Player1还是Player2接收按键的输入。

"HKUJYI"  --控制绕轴旋转的方向。

Unity 碰撞的例子


推荐阅读
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 在 Mac 上查看隐藏文件和文件夹的详细指南。通过终端命令,您可以轻松地显示或隐藏这些文件。具体步骤如下:输入 `defaults write com.apple.finder AppleShowAllFiles -bool true` 以显示所有隐藏文件,或使用 `defaults write com.apple.finder AppleShowAllFiles -bool false` 以重新隐藏它们。此方法适用于各种版本的 macOS,帮助用户更好地管理和访问系统文件。 ... [详细]
  • Unity3D 中 AsyncOperation 实现异步场景加载及进度显示优化技巧
    在Unity3D中,通过使用`AsyncOperation`可以实现高效的异步场景加载,并结合进度条显示来提升用户体验。本文详细介绍了如何利用`AsyncOperation`进行异步加载,并提供了优化技巧,包括进度条的动态更新和加载过程中的性能优化方法。此外,还探讨了如何处理加载过程中可能出现的异常情况,确保加载过程的稳定性和可靠性。 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 如何在PDF文档中添加新的文本内容?
    在处理PDF文件时,有时需要向其中添加新的文本内容。这是否可以直接实现呢?有哪些简便且免费的方法可供选择?使用极速PDF阅读器打开文档后,可以通过点击左上角的“注释”按钮切换到注释模式,并选择相应的工具进行编辑。此外,还可以利用其他功能丰富的PDF编辑软件,如Adobe Acrobat DC或Foxit PhantomPDF,它们提供了更多高级的编辑选项,能够满足更复杂的需求。 ... [详细]
  • 题目要求解决一个有趣的编程挑战,即计算由四个自然数 \( p, q, r, s \) 组成的分数序列的和。具体来说,需要编写一个 C# 程序来处理这些自然数,并通过特定的数学运算得出最终结果。该任务不仅考验编程技能,还涉及对数学公式的理解和应用。 ... [详细]
  • 在 Axublog 1.1.0 版本的 `c_login.php` 文件中发现了一个严重的 SQL 注入漏洞。该漏洞允许攻击者通过操纵登录请求中的参数,注入恶意 SQL 代码,从而可能获取敏感信息或对数据库进行未授权操作。建议用户尽快更新到最新版本并采取相应的安全措施以防止潜在的风险。 ... [详细]
  • Nginx 反向代理配置与应用指南
    本文详细介绍了 Nginx 反向代理的配置与应用方法。首先,用户可以从官方下载页面(http://nginx.org/en/download.html)获取最新稳定版 Nginx,推荐使用 1.14.2 版本。下载并解压后,通过双击 `nginx.exe` 文件启动 Nginx 服务。文章进一步探讨了反向代理的基本原理及其在实际应用场景中的配置技巧,包括负载均衡、缓存管理和安全设置等,为用户提供了一套全面的实践指南。 ... [详细]
  • POJ 2482 星空中的星星:利用线段树与扫描线算法解决
    在《POJ 2482 星空中的星星》问题中,通过运用线段树和扫描线算法,可以高效地解决星星在窗口内的计数问题。该方法不仅能够快速处理大规模数据,还能确保时间复杂度的最优性,适用于各种复杂的星空模拟场景。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 在 iOS 开发中,经常会遇到 `@(YES)`、`@[firstViewController]` 以及 `@{@a:@b}` 这样的语法糖。这些简化的写法分别用于初始化布尔值、数组和字典对象,能够显著提高代码的可读性和编写效率。例如,`@(YES)` 可以快速创建一个布尔值对象,`@[firstViewController]` 则用于创建包含单个元素的数组,而 `@{@a:@b}` 则用于创建键值对字典。理解这些语法糖的使用方法,有助于开发者更加高效地进行编码。 ... [详细]
  • 在跨线程调用UI控件方法时,通常使用同步调用机制,如 `控件.Invoke(Delegate, 参数)`。这里需要声明并实现一个委托,因为控件本身并不知道如何处理跨线程操作。通过将具体的实现逻辑封装在委托中,控件可以正确地执行这些操作,确保线程安全性和UI的一致性。此外,为了提高性能和可维护性,建议对频繁的跨线程调用进行优化,例如使用异步调用或批量处理请求。 ... [详细]
  • 近日,我在处理一个复杂的前端问题时遇到了极大困扰。具体来说,我之前开发了一个功能丰富的纯jQuery代码的前端GridView控件,实现了多种功能和视觉效果,并在多个项目中表现良好。然而,最近在尝试应用 `border-box` 布局模式时,却遇到了意想不到的兼容性和性能问题。这提醒我们在条件尚未完全成熟的情况下,应谨慎使用 `border-box` 布局模式,以免引入不必要的复杂性和潜在的bug。 ... [详细]
  • 该大学网站采用PHP和MySQL技术,在校内可免费访问某些外部收费资料数据库。为了方便学生校外访问,建议通过学校账号登录实现免费访问。具体方案可包括利用学校服务器作为代理,结合身份验证机制,确保合法用户在校外也能享受免费资源。 ... [详细]
  • 题目 E. DeadLee:思维导图与拓扑结构的深度解析问题描述:给定 n 种食物,每种食物的数量由 wi 表示。同时,有 m 位朋友,每位朋友喜欢两种特定的食物 x 和 y。目标是通过合理分配食物,使尽可能多的朋友感到满意。本文将通过思维导图和拓扑排序的方法,对这一问题进行深入分析和求解。 ... [详细]
author-avatar
阳光ai星星
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有