使用刚体(Rigidbody)组件可以让对象使用 Unity 内置的物理引擎。
添加刚体组件时先选中对象,单击 Add Component -> Physics -> Rigidbody 即可。
刚体属性:
碰撞器(Collider)组件是投射在对象周围的边界,当其他对象进入其中时可以检测。
对象不需要刚体也能发生碰撞,碰撞只需要所设计的两个对象具有一个碰撞器对象即可。
7.2.1 碰撞器对于没有碰撞器的对象,可以通过 Add Component -> Physics 选择一个碰撞器即可。
碰撞器的属性:
在对象上可以使用不同形状的多个碰撞器。Mesh Collider(网格碰撞器)是一种具有 3D 模型的精确形状的碰撞器。虽然看上去有用,但在实际中使用会极大地降低性能。所以在实际中,同时使用多个碰撞器组成复杂的碰撞器才是最有效的方法。
7.2.2 物理材质创建物理材质,在 Project 窗口中右击选择 Create -> Physic Material。
物理材质的属性:
使用物理材质时,只需要将物理材质拖拽到对象上。
7.2.3 物理碰撞碰撞器的 Is Trigger 不勾选的情况下为物理碰撞。物理碰撞的事件如下:
状态 | Collision 模式 | 调用次数 |
碰撞时 | OnCollisionEnter2D|OnCollisionEnter | 一次 |
碰撞的过程中 | OnCollisionStay2D|OnCollisionStay | 持续调用 |
碰撞结束时 | OnCollisionExit2D|OnCollisionExit | 一次 |
碰撞器的 Is Trigger 勾选的情况下为触发碰撞,触发器可以检测碰撞,当检测到碰撞后会调用如下方法:
状态 | Trigger 模式 | 调用次数 |
碰撞时 | OnTriggerEnter2D|OnTriggerEnter | 一次 |
碰撞的过程中 | OnTriggerStay2D|OnTriggerStay | 持续调用 |
碰撞结束时 | OnTriggerExit2D|OnTriggerExit | 一次 |
other 是进入触发器的UI下的引用,使用该变量可以操作相应的对象。
要让触发器工作,必须涉及到一个刚体,如果不带刚体的对象进入触发器,则什么也不会发生。
示例:
创建新的项目,在场景中添加一个立方体和一个球体,立方体的位置(-1,1,-5),球体的位置(1,1,-5)。
给立方体创建脚本 TriggerScript,给球体创建脚本 MovementScript,并挂载。
TriggerScript 脚本如下:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TriggerScript : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
private void OnTriggerEnter(Collider other)
{
print(other.gameObject.name " has entered the cube");
}
private void OnTriggerStay(Collider other)
{
print(other.gameObject.name " is still in the cube");
}
private void OnTriggerExit(Collider other)
{
print(other.gameObject.name " has left the cube");
}
}
MovementScript 脚本如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MovementScript : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
float mx = Input.GetAxis("Mouse X") / 10;
float my = Input.GetAxis("Mouse Y") / 10;
transform.Translate(mx, my, 0);
}
}
运行场景,移动鼠标,观察控制台输出。
7.3 光线投射光线投射是发出一根假设的射线(即光线)并观察它撞上某个物体之后的动作。使用光线投射可以是实现瞄准、确定视线、测量距离等动作。Unity 中使用 Raycast 方法来实现光线投射。常用的 Raycast 方法:
1.bool Raycast(Vector3 origin, Vector3 direction, float distance, LayerMask mask);
2.bool Raycast(Vector3 origin, Vector3 direction, out RaycastHit hit, float distance);
hit - 包含了被撞上的任何对象
示例:
创建新项目,向场景中添加 4 个球体,命名为 Sphere1 ~ Sphere4,位置分别为:(-1,1,-5),(1,1.5,-5),(-1,-2,5),(1.5,0,0)。
创建脚本如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RayController : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
float dirX = Input.GetAxis("Mouse X");
float dirY = Input.GetAxis("Mouse Y");
transform.Rotate(dirY, dirX, 0);
CheckForRayCastHit();
}
void CheckForRayCastHit()
{
RaycastHit hit;
if (Physics.Raycast(transform.position, transform.forward, out hit))
{
print(hit.collider.gameObject.name "destroyed!");
Destroy(hit.collider.gameObject);
}
}
}
运行游戏,移动鼠标,观察球体的销毁和控制台消息。
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved