Best way to throw GameObject with mouse ?

Hi,

I’m seeking for a script or a solution to grab a GameObject and throw it according to the mouse velocity (speed)

So far I’m able to grab and move the GameObject but I don’t know how to throw the GameObject on the mouseUp :

private var screenPoint:Vector3;
private var offset:Vector3;
private var curPosition:Vector3;
private var isDragging:boolean = false;

function Start(){
    oldMouse = Vector3.zero;
}

function FixedUpdate(){
	if(isDragging){
		var curScreenPoint:Vector3 = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z);
		curPosition = Camera.main.ScreenToWorldPoint(curScreenPoint) + offset;
		rigidbody.MovePosition(curPosition);
	}
}

function OnMouseDown(){
    screenPoint = Camera.main.WorldToScreenPoint(gameObject.transform.position);
    offset = gameObject.transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z));
    rigidbody.isKinematic = true;
}


function OnMouseDrag(){
    isDragging = true;
}

function OnMouseUp(){
    isDragging = false;
    rigidbody.isKinematic = false;
}

I assume you’re thinking of something like the game called paper toss? In one of the free unity packages there is a script called ‘DragRigidbody.js’. This script should allow to drag the desired rigid body, and because the object will have a velocity from being dragged by the mouse as soon as you let go the rigid body should continue on its trajectory.

Hope I helped.

Hi there,I have finished this functionality a few days ago.here it is:

        /********
         * by hiram
         * ******/
        using UnityEngine;
        using System.Collections;
        //using System.Collections.Generic;
        //using EasyMotion2D;
        public class NPCMainMenu : NPCBase
        {
            public float fBoundray = -200.0f;//发射边界值
            public GameObject mainMenuUIController;//碰撞时向其发送消息
            private bool beDraggedJudge = false;//被拖拽判断
            private bool positionInitJudge = true;
            private float fOffsetNPC = 40.0f;//NPC偏移量
            private Vector3 directionShoot;//发射方向
            private Vector3 positionStartFence;//发射的起始位置(通过临界线判断NPC是否发射时)
            private Vector3 positionStartNormal;//发射的起始位置(通过在临界区域内NPC是否发射时)
            private Vector3 positionEnd;//发射终止位置
            private Vector3 positionInput;//当前鼠标在屏幕点击点
            private float positionOffset;//位置偏移量
            private float timeStart;//发射起始时间
            private float timeEnd;//发射终止时间
            private float timeOffset;//时间偏移量
            private float fTempX;
            private float fTempY;
            private float fTempZ;
            private float positionTimeRatio;
            private Vector3 initPosition;
            public GameObject mainMenuController;
            void Start()
            {
                initPosition = transform.position;
            }
            public override void Update()
            {
                base.Update();
                if (Input.GetMouseButton(0))
                {
                    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                    if (!beDraggedJudge)
                    {
                        RaycastHit hit;
                        if (!Physics.Raycast(ray, out hit))
                        { //射线结果为空  
                            return;
                        }
                        if (null == hit.collider)
                        { //碰撞体为空  
                            return;
                        }
                        if (hit.collider.gameObject.tag == "NPC")
                        {
                            beDraggedJudge = true;
                        }
                    }
                    if (beDraggedJudge)
                    {
                        Debug.DrawRay(Camera.mainCamera.transform.position, ray.origin, Color.blue);
                        fTempX = ray.origin.x;
                        fTempY = ray.origin.y;
                        fTempZ = transform.position.z;
                        transform.position = new Vector3(fTempX, fTempY + fOffsetNPC, fTempZ);
                        if (positionInitJudge)
                        {
                            //初始化抛出的起始点坐标、时间
                            positionStartFence = new Vector3(fTempX, fTempY, fTempZ);
                            positionStartNormal = new Vector3(fTempX, fTempY + fOffsetNPC, fTempZ);
                            timeStart = Time.time;
                            positionInitJudge = false;//初始化完成后不再使用
                        }
                        //如果向下拖拽,重新发射起始位置、时间
                        if (positionStartFence.y > fTempY + fOffsetNPC)
                        {
                            positionStartFence = new Vector3(fTempX, fTempY + fOffsetNPC, fTempZ);
                            timeStart = Time.time;
                        }
                        if (positionStartNormal.y > fTempY + fOffsetNPC)
                        {
                            positionStartNormal = new Vector3(fTempX, fTempY + fOffsetNPC, fTempZ);
                            timeStart = Time.time;
                        }
                        //NPC超出边界,发射出去
                        if (transform.position.y > fBoundray)
                        {
                            beDraggedJudge = false;
                            //获取发射终止位置、时间
                            positionEnd = new Vector3(fTempX, fTempY + fOffsetNPC, fTempZ);
                            timeEnd = Time.time;
                            timeOffset = timeEnd - timeStart;
                            positionOffset = Vector3.Distance(positionEnd, positionStartFence);
                            positionTimeRatio = positionOffset / timeOffset;//位移与时间比率,用于控制发射速度
                            //超出临界区域调整发射速度,防止发射过快过慢
                            if (positionTimeRatio < 300.0f)//调整最小速度
                            {
                                positionTimeRatio = 1.0f;
                            }
                            else
                            {
                                positionTimeRatio /= 1000.0f;
                                if (positionTimeRatio < 1.0f)
                                {
                                    positionTimeRatio = 1.0f;
                                }
                                else
                                {
                                    if (positionTimeRatio > 3.0f)//调整最大速度
                                    {
                                        positionTimeRatio = 3.0f;
                                    }
                                    //其他为正常速度
                                }
                            }
                            m_Direction = positionEnd - positionStartFence;//起始点终止点判断发射方向
                            m_Direction.Normalize();
                            directionShoot = new Vector3(m_Direction.x, m_Direction.y, m_Direction.z);
                            ChangeDirection(positionTimeRatio * directionShoot);//发射出去
                            ChangeState(NPC_STATE.NPC_SHOOT);//改为发射状态
                        }
                    }
                }
                else//鼠标抬起时
                {
                    if (beDraggedJudge)
                    {
                        positionEnd = new Vector3(fTempX, fTempY + fOffsetNPC, fTempZ);
                        timeEnd = Time.time;
                        timeOffset = timeEnd - timeStart;
                        positionOffset = Vector3.Distance(positionEnd, positionStartFence);
                        positionTimeRatio = positionOffset / timeOffset;
                        if (transform.position.y >= -150)
                        {
                            m_Direction = new Vector3(0, 1, 0);
                            m_Direction.Normalize();
                            directionShoot = new Vector3(m_Direction.x, m_Direction.y, m_Direction.z);
                            ChangeDirection(positionTimeRatio * directionShoot);//发射出去
                            ChangeState(NPC_STATE.NPC_SHOOT);//改为发射状态
                            beDraggedJudge = false;//结束拖拽状态
                        }
                        //临界区域内抛拽发射,调整速度。
                        if (positionTimeRatio > 300.0f)//调整最小速度
                        {
                            positionTimeRatio /= 1000.0f;
                            if (positionTimeRatio < 1.0f)
                            {
                                positionTimeRatio = 1.0f;
                            }
                            else
                            {
                                if (positionTimeRatio > 3.0f)//调整最大速度
                                {
                                    positionTimeRatio = 3.0f;
                                }
                            }
                            m_Direction = positionEnd - positionStartFence;//起始点终止点判断发射方向
                            m_Direction.Normalize();
                            directionShoot = new Vector3(m_Direction.x, m_Direction.y, m_Direction.z);
                            ChangeDirection(positionTimeRatio * directionShoot);//发射出去
                            ChangeState(NPC_STATE.NPC_SHOOT);//改为发射状态 
                            beDraggedJudge = false;//结束拖拽状态
                        }
                        else//速度太小,不发射
                        {
                            transform.position = new Vector3(fTempX, fTempY, fTempZ);//由发射状态重新回到鼠标点击点
                        }
                    }
                }
                if ((transform.position.x > 340) || (transform.position.x < -315) || (transform.position.y > 450))
                {
                    mainMenuController = GameObject.FindWithTag("NPCMainMenuController");
                    mainMenuController.SendMessage("CreateNewCow", initPosition);
                    Destroy(this.gameObject);
                }
            }
            void OnTriggerEnter(Collider other)
            {
                mainMenuUIController = GameObject.FindWithTag("UIController");
                if (other.gameObject.tag == "MainMenuPlay")
                {
                    mainMenuUIController.SendMessage("Invoke_Play");
                }
                if (other.gameObject.tag == "MainMenuSurvive")
                {
                    mainMenuUIController.SendMessage("Invoke_SurviveBtn");
                }
            }
        }