unity之让obj旋转自转等操作

Posted huang--wei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unity之让obj旋转自转等操作相关的知识,希望对你有一定的参考价值。

1.让cube沿着矩形四个点运动

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class cube : MonoBehaviour {

    // Use this for initialization
    private Vector3 vec;
    float time = 0;
    void Start () {
        vec = transform.position;//存取坐标
    }
    int speed = 1;
    float speed2 = 0;
   // bool b = true;
    // Update is called once per frame
    void Update () {
        //time += Time.deltaTime;//计时器
                               //移动

        transform.localScale = new Vector3(1,1,1);
        transform.Translate(new Vector3(0.02f * speed, 0, speed2));
        if (transform.position.x >=4)
        {
            speed = 0;
            speed2 = -0.02f;
        }
        if (transform.position.z<- 4)
        {
            speed = -1;
            speed2 = 0;
   
            }
        if (transform.position.x < -4)
        {
            speed = 0;
            speed2 = 0.02f;
        }
        if (transform.position.z >0)
        {
            transform.position = vec;
            speed = 1;
            speed2 = 0;
        }
        

       
        //transform.Rotate(0, speed, 0);
    }
}

2.cube之按键操作

//transform.Rotate(Vector3.right,50,Space.World);
        自转// transform.RotateAround(Vector3.right,5);//只有世界坐标下的运动
        transform.RotateAround(Vector3.zero,Vector3.up,5);//围绕别人转
        //if (Input.GetKey("w"))
        //{s
        //    transform.Translate(Vector3.forward);//局地坐标(相对坐标)(0,0,1)
        //}
        //if (Input.GetKey("s"))
        //{
        //    transform.Translate(Vector3.back);//世界坐标,绝对坐标(0,0,-1)
        //}
        //if (Input.GetKey("a"))
        //{
        //    transform.Rotate(Vector3.down);//(0,-1,0)
        //}
        //if (Input.GetKey("d"))
        //{
        //    transform.Rotate(Vector3.up);//(0,1,0)
        //}
       // transform.Translate(Vector3.right);//(1,0,0)
       // transform.Translate(Vector3.left);//(-1,0,0)

        //if (Input.GetKey(KeyCode.W))
        //{
        //    Debug.Log("摁下了W键");
        //}
        //if (Input.GetKeyDown(KeyCode.W))
        //{
        //    Debug.Log("Down了一下");
        //}
        //if (Input.GetKeyUp(KeyCode.W))
        //{
        //    Debug.Log("Up了一下");
        //}
        //if (Input.GetKey(KeyCode.Space))
        //{
        //    Debug.Log("摁下了空格键");
        //}
        //if (Input.GetKeyDown(KeyCode.Space))
        //{
        //    Debug.Log("Down了一下");
        //}
        //if (Input.GetKeyUp(KeyCode.Space))
        //{
        //    Debug.Log("Up了一下");
        //}
        //if (Input.GetMouseButton(0))
        //{
        //    print("持续摁下了鼠标左键");
        //}
        //if (Input.GetMouseButtonDown(0))
        //{
        //    print("摁下了鼠标左键");
        //}
        //if (Input.GetMouseButtonUp(0))
        //{
        //    print("抬起了鼠标左键");
        //}
        //if (Input.GetMouseButton(1))
        //{
        //    print("摁下了鼠标右键");
        //}
        //if (Input.GetMouseButton(2))
        //{
        //    print("摁下了鼠标中键");
        //}

3.射线检测

 

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;//检测信息
        if (Physics.Raycast(ray,out hit))
        {
            print(hit.point);
            if (hit.collider.name == "Cube")
            {
                hit.collider.gameObject.GetComponent<MeshRenderer>().material.color = Color.red;
            }

        }

4.cube岁鼠标移动

public GameObject obj;
    Vector3 pos;
    bool b = false;
    // Use this for initialization
    void Start () {
        
    }
    
    // Update is called once per frame
    void Update ()
    {
       // transform.LookAt(obj.transform);
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;//检测信息
        if (Physics.Raycast(ray, out hit))
        {
            if (Input.GetMouseButtonDown(0))
            {
                pos = hit.point;
                transform.LookAt(new Vector3(pos.x, pos.y + 0.5f, pos.z));//lookat
                b = true;
            }
        }
        if (b)
        {
            transform.Translate(0,0,5*Time.deltaTime);
            if (Vector3.Distance(transform.position,pos)<1f)
            {
                b = false;
                print(123);
            }
        }
    }

5.

点击cube随机变颜色,掉下去
     using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RayDiao : MonoBehaviour {
    GameObject obj;
    // Use this for initialization
    void Start () {
        
    }
    Color[] gameclor = { Color.black, Color.blue, Color.cyan, Color.green, Color.red, Color.yellow };//定义颜色数组
    //Random num = new Random();
    // Update is called once per frame
    void Update () {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;//检查信息
        if (Physics.Raycast(ray,out hit))
            {
            if (Input.GetMouseButtonDown(0))//判断是否点击了鼠标左键
            {

            if (hit.collider.tag.Equals("cube"))//判断是否点击的是cube
            {
hit.collider.gameObject.GetComponent<MeshRenderer>().material.color = gameclor[Random.Range(0, gameclor.Length)];//随机添加颜色

                    //hit.collider.gameObject.GetComponent<Rigidbody>().useGravity = true;//使添加的刚体激活
                    hit.collider.gameObject.AddComponent<Rigidbody>();//增加刚体
                  // obj= hit.collider.gameObject;

            }
            }
        }
        //if (obj != null)//不是空
        //{
        //    obj.transform.Translate(0, -1*Time.deltaTime, 0);//以(-1*Time.deltaTime)的速度下降
        //}

    }
}

 

6. 

添加cube的方法,如消消乐
    using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class creatCube : MonoBehaviour {
    //public GameObject cube;
    // Use this for initialization

    Color [] c = { Color.black, Color.blue, Color.clear, Color.cyan, Color.green, Color.red, Color.yellow };
    void Start () {
       /* GameObject obj = Instantiate(Resources.Load("Cube")) as GameObject;*///另一种生成cube方法

        //GameObject obj = Instantiate(cube);//第二种方式生成cube,需要预制体
        //GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube);//生成cube
     //   obj.transform.position = Vector3.one;//one表示坐标(1,1,1)
     //obj.transform.rotation = Quaternion.Euler(0, 45, 0);//角度设置
     // obj.transform.localScale = new Vector3(2, 2, 2);//大小设置
        //int index =obj.name.IndexOf("(");//字符串截取
        //obj.name=obj.name.Substring(0, index);

    for (int i = 0; i<10; i++)
            {
            for (int j = 0; j < 10; j++)
            {
                GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube);//生成cube
                obj.transform.position = new Vector3(i, j, 0);//生成位置
                obj.transform.localScale = new Vector3(0.9f, 0.9f, 0.9f);//生成大小
                obj.GetComponent<MeshRenderer>().material.color = c[Random.Range(0, c.Length)];//随机颜色
            }
            }
    }
    // Update is called once per frame
    void Update () {
        
    }
}

 

7. 

鼠标点击变大
  Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        if (Physics.Raycast(ray, out hit))
        {
            if (hit.collider.gameObject.tag == "cube" &&Input.GetMouseButtonDown(0))
            {
                 cubeObj=  hit.collider.gameObject;
                cubeObj.transform.localScale = new Vector3(1,1,1);
            }        
        }
        if (Input.GetMouseButtonUp(0)&&cubeObj)
        {
            cubeObj.transform.localScale = new Vector3(0.9f, 0.9f, 0.9f);
        }

 

 8.

消消乐--单消————列表方法
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Raydaxiao : MonoBehaviour {
    GameObject obj;
    public GameObject cube;//为预制体生成cube做准备
    //Color[] c = { Color.black, Color.blue, Color.clear, Color.cyan, Color.green, Color.red, Color.yellow };
    public Material[] color;//材质数组
    Vector3 vec;
    List<GameObject> cubelist = new List<GameObject>();
    //int num = 0;
    // Use this for initialization
    void Start () {
        for (int i = 0; i < 10; i++)
        {
            for (int j = 0; j < 10; j++)
            {
                GameObject obj = Instantiate(cube);//需要预制体式添加cube
                obj.transform.position = new Vector3(i, j, 0);
                obj.transform.localScale = new Vector3(0.9f, 0.9f, 0.9f);
                //obj.GetComponent<MeshRenderer>().material.color = c[Random.Range(0, c.Length)];//上颜色
                obj.GetComponent<MeshRenderer>().material = color[Random.Range(0, color.Length)];//随机材质
                obj.tag = "cube";//定义名字为cube
                //obj.AddComponent<Rigidbody>();//添加刚体
                //num++;
                //obj.name = "Cube" + num;//生成不同名字的cube
                cubelist.Add(obj);
            }
        }

    }

    // Update is called once per frame
    void Update () {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        if(Physics.Raycast(ray,out hit))
        {
            if (hit.collider.gameObject.tag=="cube"&&Input.GetMouseButtonDown(0))
            {
                obj = hit.collider.gameObject;
                obj.transform.localScale = new Vector3(1, 1, 1);
                vec = obj.transform.position;//获取当前cube的坐标
                //Destroy(obj);//销毁cube
                Destroy(obj);
                cubelist.Remove(obj);
                foreach (GameObject item in cubelist)
                {
                    if (item.transform.position.x == vec.x && item.transform.position.y > vec.y)
                    {
                        //item.transform.position -= new Vector3(0, 1, 0);//另一种
                        item.transform.position = new Vector3(vec.x, item.transform.position.y - 1, vec.z);
                    }//自动补齐
                }
                GameObject newobj = Instantiate(cube);//重新生成cube
                newobj.GetComponent<MeshRenderer>().material = color[Random.Range(0, color.Length)];//添加颜色
                newobj.transform.position = new Vector3(vec.x, 9, vec.z);//newcube的坐标
                newobj.transform.localScale = new Vector3(0.9f, 0.9f, 0.9f);
                //newobj.AddComponent<Rigidbody>();//添加刚体
                //newobj.GetComponent<Rigidbody>().freezeRotation = true;
                //newobj.GetComponent<BoxCollider>().size = new Vector3(1.1f, 1.1f, 1.1f);

                cubelist.Add(newobj);
            }
            //if (Input.GetMouseButtonUp(0)&&obj)
            //{

            //    obj.transform.localScale = new Vector3(0.9f,0.9f,0.9f);
            //}
        }
    }
}

 

技术分享图片

 

9.

消消乐--单消--数组方法
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TextScripts : MonoBehaviour
{
    // List<GameObject> list = new List<GameObject>();
    GameObject[,] array = new GameObject[10,10];
    bool b = false;
    GameObject cube;
    Color[] c = { Color.red,Color.blue,Color.yellow,Color.green};
   public Material[] m;
    // Use this for initialization
    void Start()
    {
        for (int i = 0; i < 10; i++)
        {
            for (int j = 0; j < 10; j++)
            {
                GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube);
                obj.transform.position = new Vector3(i, j, 0);
                obj.transform.localScale = new Vector3(0.9f, 0.9f, 0.9f);
                obj.tag = "cube";
                obj.GetComponent<MeshRenderer>().material = m[Random.Range(0,3)];
                array[i, j] = obj;
            }
        }
    }

    // Update is called once per frame
    void Update()
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        if (Physics.Raycast(ray,out hit))
        {
            if (hit.collider.tag=="cube"&&Input.GetMouseButtonDown(0))
            {
                cube = hit.collider.gameObject;
                Vector3 pos = cube.transform.position;
                int a = (int)pos.x;
                int b = (int)pos.y;
                Destroy(cube);              
                for (int i = b+1; i < 10; i++)//从销毁的上边第一个开始
                {
                    array[a, i].transform.position -= new Vector3(0,1,0);/到比销毁物体坐标的y大的物体把其y-1
                    array[a, i - 1] = array[a,i];//坐标统一减去1,导致索引对应物体改变
                }

                GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube);
                obj.transform.position = new Vector3(pos.x, 9, 0);
                obj.transform.localScale = new Vector3(0.9f, 0.9f, 0.9f);
                obj.tag = "cube";
                obj.GetComponent<MeshRenderer>().material = m[Random.Range(0, 3)];
                //  list.Add(obj);
                array[a, 9] = obj;
            }
        }
       
    }
}

10.

技能冷却:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class CoolSkill : MonoBehaviour
{
    public Image image;
    float time;
    float f;
    public Text text;
    bool b = false;
    bool bb = true;
    // Use this for initialization
    void Start()
    {
        image = image.GetComponent<Image>();
        text = text.GetComponent<Text>();
        image.fillAmount = 0;//默认可以发出技能
    }
    public void GetBool()
    {
        if (bb)//限制技能开启后才能使用
        {
            b = true;
            bb = false;
        }
    }
    // Update is called once per frame
    void Update()
    {
        if (b)
        {
            time += Time.deltaTime;
            if (time <= 5)//技能控制在5秒冷却
            {
                f = (5 - time);//5秒倒计时
                image.fillAmount = (f) / 5;//image也在360度递减
                text.text = (f).ToString();//文本输出倒计时
                if (f < 0.1f && f >= 0)/控制在0.1秒以内结束时才可以重新开启技能
                {
                    bb = true;//重新开启技能Button可以点击了
                }
            }
            else
            {
                time = 0;//超过5秒后时间置零
                b = false;/tton点击后又可以计时了
            }


        }

    }
}

 

以上是关于unity之让obj旋转自转等操作的主要内容,如果未能解决你的问题,请参考以下文章

unity3d物体旋转

csharp Unity C#片段用于将变换旋转到新的相对旋转数秒

CAGradientLayer 自转

runtime:黑魔法之让人毫无知觉的修改类方法

在recyclerview片段Reandroid中屏幕旋转后进度条不显示

Unity 鼠标控制视角功能和动画播放冲突解决办法