[Unity 一] 可旋转的Cube
纯新手,先从一个Rotating Cube开始吧。
先在Hierarchy中create一个Cube,在Update()中让其旋转。
void Update () { this.transform.Rotate(Vector3.left * 1, Space.Self); //this.transform.Rotate(Vector3.right * 1, Space.Self); //this.transform.Rotate(Vector3.up * 1, Space.Self); //this.transform.Rotate(Vector3.down * 1, Space.Self); }
这样运行后,Cube就可以旋转了。
如果想添加按钮,控制其旋转的话;新建一个script,关联到Button Component上。
enum Direction { DIR_LEFT, DIR_RIGHT, DIR_UP, DIR_DOWN, }; void _roate(Direction d) { if (null == m_obj) return; switch(d) { case Direction.DIR_LEFT: m_obj.transform.Rotate(Vector3.left * 1, Space.Self); break; case Direction.DIR_RIGHT: m_obj.transform.Rotate(Vector3.right * 1, Space.Self); break; case Direction.DIR_UP: m_obj.transform.Rotate(Vector3.up * 1, Space.Self); break; case Direction.DIR_DOWN: m_obj.transform.Rotate(Vector3.down * 1, Space.Self); break; } } void rightBtn_onClick() { //Debug.Log("+ right button onClick"); _roate(Direction.DIR_RIGHT); } public void onClick(GameObject obj) { //Debug.Log("+ onClick with " + obj); m_obj = obj; switch (this.name) { case "btnLeft": leftBtn_onClick(); break; case "btnRight": rightBtn_onClick(); break; case "btnUp": upBtn_onClick(); break; case "btnDown": downBtn_onClick(); break; default: break; } }
虽然最后没有采用这种方案(因为button不能长按,每次点击一下才旋转1°)。所以随后又把button给disable了。
// Use this for initialization void Start () { Button[] btns = GameObject.FindObjectsOfType(typeof(Button)) as Button[]; foreach (Button btn in btns) { //Debug.Log("- button name: " + btn); btn.interactable = false; } }
最终采用的Key Press的方案,用户的交互比较友好。
鼠标移动到Cube上,WASD控制Cube旋转。
enum Direction { DIR_LEFT, DIR_RIGHT, DIR_UP, DIR_DOWN, //DIR_RESET, DIR_NONE }; Direction mDirection = Direction.DIR_NONE; GameObject mObj = null; // Use this for initialization void Start() { Debug.Log("+ Start mModel Script"); if (!mObj) mObj = GameObject.Find("mCube"); } void Update() { //Debug.Log("+ mModel Moves"); rTime += 0.1f; //Update direction if (Input.GetKey(KeyCode.W)) mDirection = Direction.DIR_UP; else if (Input.GetKey(KeyCode.S)) mDirection = Direction.DIR_DOWN; else if (Input.GetKey(KeyCode.A)) mDirection = Direction.DIR_LEFT; else if (Input.GetKey(KeyCode.D)) mDirection = Direction.DIR_RIGHT; else if (Input.GetKey(KeyCode.R)) { mDirection = Direction.DIR_NONE; _resetAnchor(); } } //鼠标移出Object private void OnMouseExit() { //Debug.Log("+ on mouse exit"); mDirection = Direction.DIR_NONE; mShowText = false; } //鼠标移入Object private void OnMouseOver() { float px, py, pz, x, y, z; Vector3 pos_cam, pos_cube, pos_mouse; //Mouse Position // 获取目标对象当前的世界坐标系位置,并将其转换为屏幕坐标系的点 pos_cam = Camera.main.WorldToScreenPoint(transform.position); // 设置鼠标的屏幕坐标向量,用上面获得的Pos的z轴数据作为鼠标的z轴数据,使鼠标坐标与目标对象坐标处于同一层面上 //Vector3 mousePos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, pos_cam.z); pos_mouse = Input.mousePosition; px = Input.mousePosition.x; py = Input.mousePosition.y; pz = pos_cam.z; if (mObj) { pos_cube = mObj.transform.position; //Debug.Log("+ position: " + _obj.transform.position); x = pos_cube.x; y = pos_cube.y; z = pos_cube.z; //Debug.Log("+ cube position: " + pos_cube); } _roate(mDirection); }
然而,用户第一次使用的时候,没有tip提醒怎么操作(WASD按键)。自然,我们就想加上一个Label说明。
private void OnGUI() { string _text = @"[W] for UP ROATE [S] for DOWN ROATE [A] for LEFT ROATE [D] for RIGHT ROATE [R] for RESET Anchor"; GUIStyle _style = new GUIStyle(); _style.fontSize = 26; _style.normal.background = null; _style.normal.textColor = new Color(1, 0, 0); if (mShowText) { //Debug.Log("+ Show TEXT"); GUI.Label(new Rect(Input.mousePosition.x + 10, Screen.height - Input.mousePosition.y + 10, 300, 300), _text, _style); } }
这里的GUI.Label只能在OnGUI()中创建。
并且设置了RESET功能,让Cube回归(0,0,0)坐标系。
private void _resetAnchor() { if (!mObj) return; //this.transform.rotation(); float x, y, z; x = mObj.transform.localEulerAngles.x; y = mObj.transform.localEulerAngles.y; z = mObj.transform.localEulerAngles.z; //w = mObj.transform.localEulerAngles.w; //mObj.transform.rotation = null; //Debug.Log("+ position: " + x + ", " + y + ", " + z); mObj.transform.rotation = Quaternion.Euler(0, 0, 0); }
收工!
离入门还很远,扫地僧只是骑着脚踏车到了山脚下,刚看到那1024阶的台阶而已。