您的位置:首页 > 移动开发 > Unity3D

unity 学习 处理一个物体 单击事件

2017-12-19 17:36 253 查看

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);  //从当前屏幕鼠标位置发出一条射线

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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐