//鼠标不用点,这个物体不用加rigidbody
void OnMouseEnter() {
Debug.Log("鼠标进入小块了");
}
//鼠标悬浮
void OnMouseOver()
{
}
//鼠标按下
void OnMouseDown()
{
}
//鼠标抬起
void OnMosueUp()
{
}
//当鼠标在这个物体上按下,并且在这个物体上抬起时调用
void OnMosueUpAsButton()
{
}
void OnMouseDrag() {
//切水果可以用这个
Debug.Log("别拽我");
}
2.触发检测
collider必须勾选上Is Trigger选项,下列的方法才能被触发
//进入物体范围
void OnTriggerEnter(Collider other)
{
}
//collider停止触发时
void OnTriggerExit(Collider other)
{
}
//collider接触触发器时,每一帧调用
void OnTriggerStay(Collider other)
{
}
3.碰撞检测
物体之间发生碰撞,必须有一个碰撞发起者,也就是挑事的那个物体
碰撞发起者特征:带有Rigidbody或者Character Controller
碰撞的受害者特征:带有Collider组件
先简单的总结一下带有Rigibody的碰撞
//刚开始碰撞
void OnCollisionEnter(Collision other)
{
}
//停止碰撞
void OnCollisionExit(Collision other)
{
}
//发生碰撞时,每一帧被调用
void OnCollisionStay(Collision other)
{
}
带有Character Controller(人形碰撞器)的物体,它就不受力的影响了,并且它加上Rigidbody也没用
它通常的做法是给与之碰撞的物体加上Rigidbody,在带有人形碰撞器的脚本中,使用它自带的一个碰撞方法,当触发这个方法时,获取到与之相撞的物体的Rigidbody,然后设置力什么的
void OnControllerColliderHit(ControllerColliderHit hit)
{
Debug.Log("Controller撞上别的啦");
hit.collider.gameObject.GetComponent<Rigidbody>().AddForce(0, 0, 2f);
}
注:通常我们使用键盘按键改变物体的坐标可以用Transform,但是带有Character Controller的物体只能使用Character Controller的Move方法才算移动,两个物体想接触时才能发生碰撞效果
public class IamCharacter : MonoBehaviour
{
float x;
float y;
private CharacterController character;
void Start()
{
character = this.GetComponent<CharacterController>();
}
// Update is called once per frame
void Update()
{
//这种方法及时能控制物体的移动,但是两个物体相接触时,并不会调用OnControllerColliderHit方法
//x = Input.GetAxis("Horizontal");
//y = Input.GetAxis("Vertical");
// //this.transform.position = new Vector3(this.transform.position.x+x,0,y+this.transform.position.z);
// this.transform.Translate(x,0,y);
if (Input.GetKey(KeyCode.W))
{
character.Move(transform.forward * 0.1f);
}
if (Input.GetKey(KeyCode.A))
{
character.Move(-transform.right * 0.1f);
}
if (Input.GetKey(KeyCode.S))
{
character.Move(-transform.forward * 0.1f);
}
if (Input.GetKey(KeyCode.D))
{
character.Move(transform.right * 0.1f);
}
}
void OnControllerColliderHit(ControllerColliderHit hit)
{
Debug.Log("Controller撞上别的啦");
hit.collider.gameObject.GetComponent<Rigidbody>().AddForce(0, 0, 2f);
}
4.粒子碰撞
这个脚本要加在粒子对象身上,并且要勾选上粒子属性里的Collision。把Collision中的第一个参数改为World,并勾选上Send Collision Message
void OnParticleCollision(GameObject other)
{
Debug.Log("粒子撞上别的了");
}
5.绘制Gizmos,Gizmos是一个可视化辅助设置类,也就是用来画图的,在Scene场景里能看见,但在game场景里看不见
//绘制Gizmos,可视话辅助设置类
//每一帧调用
void OnDrawGizmos()
{
//这个a.png必须在Gizmos目录下
Gizmos.DrawIcon(this.transform.position,"a.png");
}
//只有物体被选择的时候才被调用
void OnDrawGizmosSelected()
{
Gizmos.color = Color.white;
}
6.InVoke
public GameObject cube;
void Start () {
//在游戏开始后3f开始调用,之后每4f调用一次这个方法,它跟Start方法没关系了,自己独立调用,这个方法通常放在start或Awake方法里
//如果放在Update方法里,当到达3f时,这个方法开始调用。Update下一帧又开始调用这个方法,也就是有好几个这个方法(CubeInstance方法)执行每4f调用一次。就混乱了
//应用:计时器
// InvokeRepeating("CubeInstance", 3f, 4f);
//应用场景:刚进入游戏时,在经过了5秒后,开始生怪物或者生成障碍物
// Invoke("CubeInstance", 3f);//在3f之后开始像调正常方法一样,调用这个方法,这个3f只有在第一次调用时可以停3f有效
//if (Input.GetKeyDown(KeyCode.V)) {
// CancelInvoke();//停止调用
// CancelInvoke("CubeInstance");//只能停掉invoke
// }
print("start");
}
void CubeInstance() {
// print(Time.time);
// Instantiate(cube);
}