前言
前面记录了一些通过脚本控制对象模型移动和通过用户的操作对模型进行变化的方法,那么为了让我们创造的不论是地形还是模型都拥有真实的物理引擎(大雾),那么这次就使用脚本控制模型感受一下什么叫做重力和碰撞吧
前置
- 输入系统:INputSystem
- 角色控制器CharacterController:不能同时添加刚体组件
- move();需要乘deltaTime,不受重力影响,需要使用isGrounded判断
- SimpleMove():不需要乘deltaTime,受重力影响
- 碰撞体:collider
- 碰撞检测:两方都有Collider,至少一方有Rigidbody
- 刚体:rigidbody
控制方法
这里和之前的代码很相似,毕竟只是稍微修改了一下,根本的东西没有什么变化
public class 找异性 : MonoBehaviour
{
CapsulecastCommand cc;//创建一个capsulecastcommand对象
// Start is called before the first frame update
void Start()
{
cc = GetComponent<CapsulecastCommand>();
}
public float floSpeed = 2;
public float floRotate = 2;
// Update is called once per frame
void Update()
{
Move();//键盘控制物体平移
Look();//鼠标控制物体旋转
}
protected void Move()
{
float x = Input.GetAxis("Horizontal");
float z= Input.GetAxis("Vertical");
transform.Translate(new Vector3(x,0, z) * floSpeed * Time.deltaTime);
}
private void Look()
{
float y = Input.GetAxis("Mouse Y") *floRotate* Time.deltaTime;
float x = Input.GetAxis("Mouse X") *floRotate* Time.deltaTime;
transform.Rotate(Vector3.up, x);
transform.Rotate(Vector3.down, y);
}
//碰撞检测的方法
private void OnCollisionEnter(Collision collision)//碰撞发生时
{
//Destroy(collision.transform.gameObject);
Debug.Log("刚碰到");
}
private void OnCollisionExit(Collision collision)//碰撞结束时
{
Debug.Log("碰完了");
}
private void OnCollisionStay(Collision collision)//正在碰撞时
{
Debug.Log("");
}
}
这样我们就可以做到让我们创建的模型进行物理碰撞(而不是穿模了)
查看效果
一开始是这样的效果(指开始创建的正常的对象)
然后就会变成这个样子
由于重力的原因,创建的对象模型(球),进行了一个坠的下,然后我们再像之前一样使用键盘对模型进行操作
可以看到产生了一些奇怪的变化,整个世界旋转了起来,并且一直在旋转,这大概是碰撞的结果罢(心虚),其实这样因为摄像机的位置的原因,我们可以看到在这个过程中,摄像机被设置为了跟随球,于是在球被碰撞后,摄像机就随之转了起来,而如果我们把摄像机拿下来,就可以发现一些新的操作
可以看到球球跟随着键盘移动,然后如果碰撞到了其他模型
就会发现,球球旋转着(坐标变化)离开了这个世界(
移动方式
在碰撞完之后,来看看如何让模型在之前创建的地图中进行移动
//世界坐标系移动
CapsulecastCommand.move(new Vector3(x, 0, z) * floSpeed * Time.deltaTime);
cc.isGrounded; //bool值,判断是否在地面
cc.SimpleMove Vector3(x,0,z)*floSpeed)
//局部坐标移动
cc.SimpleMove((transform.forward * z + transform.right * x) * floSpeed);
将这段代码加入到move方法中去(当然不能同时添加,毕竟是两种不同的方式),然后就会发现我们可以通过键盘的操控使得模型在地图中进行移动,这里就不加以赘述,感兴趣可以自行尝试