角色选择界面角色与鼠标的旋转交互

发表于2017-12-01
评论0 1.2k浏览

这里的脚本要实现的功能是在角色选择界面,人物3D模型自动旋转,然后鼠标在角色身上向左拖拽,角色往左旋转;向右拖拽,角色向右旋转,拖拽后角色旋转方向与退出拖拽时,鼠标的移动方向一致。单击人物则停止旋转,一起来看看实现的方法吧。


下面是脚本:

using UnityEngine;  
using System.Collections;  
public class OnCharacterClick : MonoBehaviour {  
    Vector3 preMousePos,downPos;  
    float rotateDir=1;  
    bool dragging;  
    public float rotateSmoothing;  
    // Use this for initialization  
    void Start () {  
        InvokeRepeating("detectMousePos",0.1f,0.1f);  
    }  
    void detectMousePos()  
    {  
        preMousePos = Input.mousePosition;  
    }  
    // Update is called once per frame  
    void Update () {  
        if (!dragging)  
        {  
            transform.Rotate(transform.up,rotateDir*rotateSmoothing);  
        }  
    }  
    void OnMouseDrag()  
    {  
        dragging = true;  
        //当值小于0,说明鼠标向左拖,否则相反  
        float dragDeltaX=Input.mousePosition.x - preMousePos.x;  
            transform.Rotate(transform.up,dragDeltaX*3600000);  
    }  
    void OnMouseDown()  
    {  
        downPos = Input.mousePosition;  
    }  
    void OnMouseUp()  
    {  
        float deltaX=Input.mousePosition.x-downPos.x;  
        if (Mathf.Abs(deltaX)>0.2)  
        {  
            if (deltaX < 0)  
            {  
                rotateDir = 1;  
            }  
            else  
            {  
                rotateDir = -1;  
            }  
            dragging = false;  
        }  
    }  
}  
将其放到角色身上,设置公有属性即可。

然后角色身上的rigidBody记得设置如下:


如果你脚本要放的物体是NGUI的子物体,也就是说他的transform.root是UIRoot的,因为Unity的鼠标事件在NGUI不响应了,那么程序要稍作修改:

using UnityEngine;  
using System.Collections;  
public class RotateSelf : MonoBehaviour {  
    Vector3 preMousePos, downPos;  
    float rotateDir = 1;  
    bool dragging;  
    public float rotateSmoothing;  
    // Use this for initialization    
    void Start()  
    {  
        InvokeRepeating("detectMousePos", 0.1f, 0.1f);  
    }  
    void detectMousePos()  
    {  
        preMousePos = Input.mousePosition;  
    }  
    // Update is called once per frame    
    void Update()  
    {  
        if (!dragging)  
        {  
            transform.Rotate(transform.up, rotateDir * rotateSmoothing);  
        }  
    }  
    void OnDrag()  
    {  
        //当值小于0,说明鼠标向左拖,否则相反    
        float dragDeltaX = Input.mousePosition.x - preMousePos.x;  
        transform.Rotate(transform.up, dragDeltaX * 3600000);  
    }  
    void OnPress(bool isDown)  
    {  
        if (isDown)  
        {  
            dragging = true;  
            downPos = Input.mousePosition;  
        }  
        else  
        {  
            float deltaX = Input.mousePosition.x - downPos.x;  
            if (Mathf.Abs(deltaX) > 0.2)  
            {  
                if (deltaX < 0)  
                {  
                    rotateDir = 1;  
                }  
                else  
                {  
                    rotateDir = -1;  
                }  
                dragging = false;  
            }  
        }  
    }  
}

或者直接不需要自动旋转,可以使用NGUI提供的Spin With Mouse脚本,它提供了鼠标拖拽绕Y轴旋转的功能。或者如果只需要旋转可以使用transform的raotation的Animation。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引