1.学习一个物体单击事件
单机一个Cube物体,在点击位置播放一个特效,并且给一个力。
下面是代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class kick : MonoBehaviour {
public Camera activeCamera;//主场景摄像机
public float Force;//Cube收到的力基数
public ParticleSystem Particles;//粒子系统(点击的时候播放一下 拖拽的方式赋值)
private Rigidbody rb; //获得这个实例的刚体
void Awake()
{
rb = GetComponent<Rigidbody>();
activeCamera = GameObject.Find("Scene Camera").GetComponent<Camera>();//摄像机赋值
}
// Use this for initialization
void Start ()
{
}
// Update is called once per frame
void Update ()
{
if (Input.GetMouseButtonUp(0))
{
checkKick();
}
}
void OnMouseDown()
{
}
void OnMouseUp()
{
}
void checkKick()
{
RaycastHit hit;//射线投射碰撞信息
// 从鼠标所在的位置发射
Vector2 screenPosition = Input.mousePosition;//当前鼠标的位置
var ray = activeCamera.ScreenPointToRay(screenPosition); //从当前屏幕鼠标位置发出一条射线
if (Physics.Raycast(ray, out hit) && hit.transform == transform)//判断是否点击到实例物体上
{
//hit.rigidbody.AddForceAtPosition(ray.direction * Force, hit.point, ForceMode.Impulse);//给这个刚体一个力
rb.AddForceAtPosition(ray.direction * Force, hit.point, ForceMode.Impulse);//给这个刚体一个力
Instantiate(Particles, hit.point, Quaternion.identity);//播一个特效
}
}
}
Ray 射线
创建一条射线从origin开始,沿direction方向。
Ray ray = new Ray(Vector3 origin, Vector3 direction);
//从当前变换位置开始,沿当前变换的Z方向创建一条射线。
Ray ray = new Ray(transform.position, transform.forward);
Camera.ScreenPointToRay
Ray ScreenPointToRay(Vector3 position);//返回一条射线从摄像机通过一个屏幕点。
Vector2 screenPosition = Input.mousePosition;//当前鼠标的位置
var ray = activeCamera.ScreenPointToRay(screenPosition); //从当前屏幕鼠标位置发出一条射线
var ray = activeCamera.ScreenPointToRay(screenPosition); //从当前屏幕鼠标位置发出一条射线
RaycastHit 射线投射碰撞信息
该结构用来获取射线投射返回的信息。用来记录从raycast函数中得到的信息反馈。Transform: 碰撞到的物体的Transform节点
Rigidbody: 碰撞到的物体的刚体
Physics.Raycast 射线投射
RaycastHit hit;//射线投射碰撞信息
// 从鼠标所在的位置发射
Vector2 screenPosition = Input.mousePosition;//当前鼠标的位置
var ray = activeCamera.ScreenPointToRay(screenPosition); //从当前屏幕鼠标位置发出一条射线
if (Physics.Raycast(ray, out hit) && hit.transform == transform)//判断是否点击到实例物体上
{
//hit.rigidbody.AddForceAtPosition(ray.direction * Force, hit.point, ForceMode.Impulse);//给这个刚体一个力
rb.AddForceAtPosition(ray.direction * Force, hit.point, ForceMode.Impulse);//给这个刚体一个力
Instantiate(Particles, hit.point, Quaternion.identity);//播一个特效
}
从摄像机发射一条射线,只和target层发生碰撞,碰撞后得到碰撞体的信息,并返回一个布尔值。
在发射的轨迹中,一旦与其他物体发生碰撞,它就会停止。返回的布尔值则为true。并且将第一个碰到的信息记在 RaycastHit hit,所以这个变量就携带了射线碰撞到那个物体的一些信息(这里碰到的是方块cube)。
这个函数还有其他一些多态函数,用到的时候可以看看用哪个比较合适。
Instantiate 初始化的实例
// 参数一:是预设类型(这里是粒子系统)
//参数二:实例化预设的坐标
//参数三:实例化预设的旋转角度
Instantiate(Particles, transform.position, randomRotation);
当点击到一个实例Cube的实例上的时候,给一个力的同时,我们通过预制体实例化一个粒子实例。但是需要粒子效果播放之后自动销毁,否则这个粒子会一直播放,这里的处理方法是在这个粒子预制体上加了一个脚本,控制延迟自动销毁。如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class killMe : MonoBehaviour {
public float Delay;
private IEnumerator Start()
{
if (Delay != 0) yield return new WaitForSeconds(Delay);
Destroy(gameObject);
}
}