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

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);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值