知识点:
- 刚体组件(rigidbody),受力和碰撞的组件
- 触发器(Trigger),开启后物体碰撞效果取消,但仍会返回碰撞消息
- 复制物体对象:
var box = Instantiate(对象);
- 设置对象坐标位置:
box.transform.position = new Vector3(三维坐标点);
- 绘制光标:绘制是从左上角为原点开始绘制,为了在准心射击,坐标点做些偏移。
Cursor.SetCursor(MyCursor, new Vector2(MyCursor.width / 2, MyCursor.height / 2), CursorMode.Auto);
- 判断按键:
Input.GetButtonDown(按键);
- 获取屏幕射线对象:
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
- 判断射线的物理碰撞:
Physics.Raycast(射线对象,out 碰撞物体, 射线最长距离)
Physics.Raycast(ray,out Hit, 50)
- 给物体速度、方向:射线碰撞坐标和子弹当前坐标只差形成一个向量,确定速度方向,然后乘上速度大小
物体对象.GetComponent<Rigidbody>().velocity = 速度方向 * 速度大小;
bullet.GetComponent<Rigidbody>().velocity = (Hit.point - bullet.transform.position) * 5;
步骤:
-
准备物体和子弹、地板,物体和子弹存储对象后,就可以删掉
子弹和物体都要添加刚体组件
-
创建GameObject对象,存储脚本
-
设置对象变量,把物体对象赋值给变量
-
设置Quad墙体,这样鼠标点击任何位置都会触发射线碰撞事件
取消墙体渲染,这样墙体就是透明效果。
开启触发器,这样子弹就不是撞墙,会穿过墙体。
-
设置光标,找一张透明底的贴图,设置成光标,再赋值给脚本变量
-
优化项目:删除摄像机视野外的物体对象,节省资源。删除脚本添加在物体内。
脚本代码
HitPlayGame.cs
public class HitPlayGame : MonoBehaviour
{
//箱子
public GameObject Box;
//球体(子弹)
public GameObject Bullet;
//光标
public Texture2D MyCursor;
// Start is called before the first frame update
void Start()
{
for(int i = 0; i < 5; i++)
{
for(int j = 0; j < 5; j++)
{
//复制物体对象,并返回该物体对象,参数:被复制的对象
var box = Instantiate(Box);
//设置物体的位置
box.transform.position = new Vector3(-2f+i, 0.5f+j, 4.5f);
}
}
//绘制光标
Cursor.SetCursor(MyCursor, new Vector2(MyCursor.width / 2, MyCursor.height / 2), CursorMode.Auto);
}
// Update is called once per frame
void Update()
{
//按一下鼠标左键,发射一次子弹
if (Input.GetButtonDown("Fire1"))
{
复制物体对象,并返回该物体对象,参数:被复制的对象
var bullet = Instantiate(Bullet);
//设置物体的位置
bullet.transform.position = Camera.main.transform.position;
//获取屏幕射线对象
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
//碰撞物体变量
RaycastHit Hit;
//判断射线是否有碰撞对象
if(Physics.Raycast(ray,out Hit, 50))
{
//给子弹对象一个方向和速度
bullet.GetComponent<Rigidbody>().velocity = (Hit.point - bullet.transform.position)*5;
}
}
}
}
DestoryObj.cs
public class DestoryObj : MonoBehaviour
{
/// <summary>
/// 超出摄像机视野执行
/// </summary>
private void OnBecameInvisible()
{
//删除对象
Destroy(gameObject);
}
}