• C# 碰撞,射线,点击,周期函数等基本代码


    using UnityEngine.SceneManagement;
     
    SceneManager.LoadScene(0);
     
     
    ���� 
     Application.LoadLevel(Application.loadedLevelName);括号里面的参数是最后加载的场景名,也就是当前场景名
        
    public class FirstDemo : MonoBehaviour {
        //重置时候,或者第一次被添加的时候执行的函数
        
        //void Reset() {//编辑状态下被调用的函数
        //    level = 1;
        //    Debug.Log("第一个执行的函数");
        //    print("我是reset");//通过集成而来的静态的方法;
        //}
       //每次对象激活就调用一次此函数,第二调用的函数
        void OnEnable() {
            print("我Cube是显示状态,激活状态");
        }
        //第一次调用该脚本:第一个被执行的函数是Awake
        void Awake() { 
            //唤醒:只执行一次,不可以被重复调用
            print("我CUbe是唤醒函数");
        }
        /*
         所有的对象都被唤醒之后,在执行update之前会先执行start,
         * 只执行一次;
         * Awake()本对象数据初始化
         * Start()访问组建,访问其他对象
         */
        void Start() {
            print("我是cube的start");
        }
        /*
         固定更新:每秒固定执行我们设置好的帧数
         */
        void FixedUpdate() { 
       /// 重复执行
        }
        
        // 跟电脑性能有关系,默认电脑大概50/s
        void Update () {
            //重复执行
        }
        //这一帧结束之前执行的函数
        void LateUpdate() { 
        
        }
        //处于未激活状态就调用此函数一次
        void OnDisable() {
            print("我处于未激活状态,隐藏");
        }
        
    }  
     
     脚本默认继承Monobehaviour
     Monobehaviour:Behaviour:Component;
     大多数的脚本作为组件的方式添加游戏对象身上,不是一个组件不可以添加;
     Monobehaviour:Behaviour:Component:提供很属性让我们直接访问对象的相关组件,获取信息;
     * 提供方法访问改变游戏对象;
     Monobehaviour生命周期:一帧所有执行函数
     * 编辑状态:
     * Reset:脚本第一次被添加,或者按reset按钮就会调用一次该函数
     * 运行期间:
     * Awake()唤醒,只执行一次,第一个执行函数
     * OnEnable()激活时被调用,第一次运行对象被激活就调用一次,下次再激活再调用
     * 当所有对象的唤醒和OnEnable都执行完后,相当场景中游戏对象都创建完毕
     * Start()所有对象的唤醒和onenable都执行完后,才会执行start();
     * update()执行之前就会先到用Start();
     * Update()更新函数根据电脑性能来执行,大概50/s,不断重复执行;
     * FixedUpdate()固定更新,自定义帧频;
     * LateUpdate():所有物理函数,输入函数,以上函数都执行完毕后就调用执行函数,每帧都会调用
       OnDisable()未激活时就调用此函数,重复调用  
     * 通过键盘控制对象左右旋转,前后移动
     */
     
     
    /*
     Input:访问输入设备:键盘,鼠标,摇杆,触屏,手机重力感应
     * GetKeyDown(KeyCode code)检测是否按下某个键,只检测一次
     * 按下那一瞬间返回true
     * GetKeyUp(KeyCode code)检测是否松开键盘的某一个键
     * 松开那一刻返回true
     * GetKey(KeyCode)
     * 只要一直按着一个键,就一直返回true,除非松开
    GetMouseButtonDown()
     * GetMouseButtonUp()
     * GetMouseButton()
     */
     */
        
    
    void OnMouseDown() {
            print("我按下鼠标");
        }
        void OnMouseUp() {
            print("我松开鼠标");
        }
        void OnMouseOver() {
            print("我在对象上");
        }
        void OnMouseEnter() {
            print("我进入对象");
        }
        void OnMouseExit() {
            print("我离开对象");
        }
     
    
    
    
    
    
     //Horizontal水平虚拟轴,控制左右移动或者左右旋转
            float angleSpd=Input.GetAxis("Horizontal");//AD左键右键
            this.transform.Rotate(0,angleSpd*20*Time.deltaTime, 0);
            float speed = Input.GetAxis("Vertical");
            this.transform.Translate(0, 0, speed * 20 * Time.deltaTime);
    
    
    
    
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class RayDemo : MonoBehaviour {
    
        // Use this for initialization
        void Start () { 
            
        }
        
        // Update is called once per frame
        void Update () {
            if (Input.GetMouseButtonDown(0))
            {
                //把屏幕坐标转换为射线
                Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                //存储射线碰撞的信息
                RaycastHit hit;
                /*
                 * 射线检测主要是检测射线是否跟场景中碰撞体发生碰撞,相交
                 进行射线检测,发生碰撞,就会碰撞信息存到hit里面;
                 * 同时返回true,反之返回false,hit还是空的;
                 * Raycast(Ray,out RaycastHit)
                 * Raycast(Ray,out RaycastHit,float maxDistance,int layermask)
                 */
                if (Physics.Raycast(ray, out hit,100,512)) {
                    print("发生碰撞,鼠标访问到一个对象");
                    print("相交位置:"+hit.point);
                    print("碰撞的对象:" + hit.collider.gameObject);
                }
            }
        }
    } 
    
    
    
    void CastUp() {
            if (currentClick != null) {
                print("向上发射摄像");
                //发射一条向上的射线
                Ray r = new Ray(currentClick.transform.position+new Vector3(0,0.5f,0), Vector3.up);
                RaycastHit hit;
                if (Physics.Raycast(r,out hit,0.5f,256)) {
                   // print("点击到一个对象");
                    print("检测到一个对象");
                    GameObject obj = hit.collider.gameObject;
                    MeshRenderer mr=obj.GetComponent<MeshRenderer>();
                    print("颜色:" + mr.material.color);
                }
    
            }
        }
     
    
    
    
    
    
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class RayDemo : MonoBehaviour {
    
        // Use this for initialization
        GameObject currentClick;
        void Start () { 
            
        }
        
        // Update is called once per frame
        void Update () {
            if (Input.GetMouseButtonDown(0))
            {
                //把屏幕坐标转换为射线
                Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                //存储射线碰撞的信息
                RaycastHit hit;
                /*
                 * 射线检测主要是检测射线是否跟场景中碰撞体发生碰撞,相交
                 进行射线检测,发生碰撞,就会碰撞信息存到hit里面;
                 * 同时返回true,反之返回false,hit还是空的;
                 * Raycast(Ray,out RaycastHit)
                 * Raycast(Ray,out RaycastHit,float maxDistance,int layermask)
                 */
                if (Physics.Raycast(ray, out hit,int.MaxValue,256)) {
                    currentClick = hit.collider.gameObject;
                    //print("发生碰撞,鼠标访问到一个对象");
                    //print("相交位置:"+hit.point);
                    //print("碰撞的对象:" + hit.collider.gameObject);
                    print("点击到一个对象");
                    CastUp();
                }
            }
        }
        void CastUp() {
            if (currentClick != null) {
                print("向上发射射线");
                //发射一条向上的射线
                Ray r = new Ray(currentClick.transform.position+new Vector3(0,0.5f,0), Vector3.up);
                RaycastHit hit;
                if (Physics.Raycast(r,out hit,0.5f,256)) {
                   // print("点击到一个对象");
                    print("检测到一个对象");
                    //检测到的上面对象
                    GameObject obj = hit.collider.gameObject;
                    //获取组件网格渲染
                    MeshRenderer mr=obj.GetComponent<MeshRenderer>();
                    //获取该对象颜色
                    Color c = mr.material.color;
                    //获取点击对象的颜色
                    Color currentC = currentClick.GetComponent<MeshRenderer>().material.color;
                   //判断颜色是否一样
                    if (c.Equals(currentC)) {
                        //删除
                        Destroy(obj);
                        Destroy(currentClick);
                        obj = null;
                        currentClick = null;
                    }
                }
    
            }
        }
    }
    /*
     Ray:射线,起点和方向
     * RaycastHit:存储射线碰撞碰撞的信息;
     * Phyics.Raycast(Ray,out RaycastHit)用来进行碰撞检测
     * Phyics.Raycast(Ray,out RaycastHit,float maxDistance,int layermask)用来进行碰撞检测 
    
    public class RayLayerDemo : MonoBehaviour {
    
        // Use this for initialization
        void Start () {
            
        }
        
        // Update is called once per frame
        void Update () {
            if (Input.GetMouseButtonDown(0))
            {
                Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                RaycastHit hit;
                int layerIndex=LayerMask.NameToLayer("wall");
                print(1 << layerIndex);//位移运算
                if (Physics.Raycast(ray, out hit, int.MaxValue, 1<<layerIndex))//(int)Mathf.Pow(2,layerIndex)))
                {
                    print("点击到一个对象");   
                }
            }
        }
    }
     
    
    public class GunFire : MonoBehaviour {
    
        // Use this for initialization
        public Transform BulletP;
        void Start () {
            
        }
        
        // Update is called once per frame
        void Update () {
            if (Input.GetMouseButtonDown(0)) {
                CreateBullet();
            }
        }
        void CreateBullet() {
            //创建一个指定类型的3D对象
            GameObject bullet = GameObject.CreatePrimitive(PrimitiveType.Sphere);
            //初始化子弹的位置
            bullet.transform.position = BulletP.position;
            bullet.transform.localScale = new Vector3(.3f, .3f, .3f);
            //加上刚体组件
            Rigidbody rg=bullet.AddComponent<Rigidbody>();
            //Transform 属性 forward返回该对象的正前方方向向量,Z正前方
            rg.velocity = BulletP.forward * 10;
        }
    }
    
      
    
    public class BallMove : MonoBehaviour {
    
        // Use this for initialization
        Rigidbody rg;
        bool isDead;
        void Start () {
            rg = this.GetComponent<Rigidbody>();
            isDead = true;
            rg.velocity = Vector3.up * 3;
        }
        
        // Update is called once per frame
        void Update () {
            if (isDead&&Input.GetButtonDown("Jump")) {
                //添加一个速度
                rg.velocity = Vector3.up * 5;
                //添加一个力
               // rg.AddForce(Vector3.up * 300);
            }
        }
        /*
         两个物体可以发生碰撞的条件:
         * 双方必须都有碰撞器
         * 一方必须要有刚体
         * 碰撞器有三个回调函数:
         * OnCollisionEnter(Collision obj)刚好接触,刚好发生碰撞那一刻调用函数,只调用一次
         * OnCollisionStay(Collision obj)碰撞中,逗留,只要两个物体没有分离,每帧都回响应该函数
         * OnCollisionExit(Collision obj)碰撞结束,退出碰撞,只执行一次
         * Collision返回当前发生碰撞的碰撞信息
         */
        void OnCollisionEnter(Collision obj) {
            isDead = false;
            print("跟我发生碰撞的对象:"+obj.gameObject);
            if (obj.gameObject.name == "Plane") rg.isKinematic = true;
        }
    }
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class ControlB : MonoBehaviour {
    
        // Use this for initialization
        float speed;
        void Start () {
            speed = 0;
        }
        
        // Update is called once per frame
        void Update () {
           // float sx = Input.GetAxis("Horizontal");
            Move();
           
        }
        void Move() {
            if (Input.GetKey(KeyCode.A))speed = -.1f;
            else if (Input.GetKey(KeyCode.D))speed = .1f;
            else speed = 0;
            
            this.transform.Translate(speed, 0, 0);
        }
    } 
     
    public class RoleMove : MonoBehaviour {
    
        // Use this for initializatio
        CharacterController role;
        void Start () {
            role = this.GetComponent<CharacterController>();
           // role.Move(transform.forward * 2);
        }
        
        // Update is called once per frame
        void Update () {
            float speed = Input.GetAxis("Vertical");
            role.Move(transform.forward * speed*Time.deltaTime);
        }
    }
      
        // Update is called once per frame
        void Update () {
            float speed = Input.GetAxis("Vertical");
            //动力学,只产生位移,不受重力影响
           // role.Move(transform.forward * speed*Time.deltaTime);
            role.SimpleMove(speed*transform.forward);//模拟重力
        }
        /*
         角色控制器的碰撞响应函数,只要发生碰撞就一直响应
         * 碰撞响应函数是在移动过程中发生碰撞才 响应
         */
        void OnControllerColliderHit(ControllerColliderHit obj) {
            if (obj.gameObject.tag.Equals("barrier"))
            {游戏对象
    //
                Destroy(obj.gameObject);
            }
        
        }
    }
     
    
     
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class SnakeControl : MonoBehaviour {
        //蛇,父对象,保存子对象
        public Transform Snake;
        public GameObject Food;
        public GameObject Body;
        float currentTime = 0;
        float singleTime = 0.4f;
        GameObject firstBody;
        GameObject lastBody;
        void Start () {
          //  print(transform.forward);
            RandomFood();
        }
        void RandomFood() {
            int sx = Random.Range(-25, 25);
            int sz = Random.Range(-50, 50);
            GameObject food = GameObject.Instantiate(Food);
            food.transform.position = new Vector3(sx, 0.5f, sz); ;
        }
        // Update is called once per frame
        void Update () {
            if (currentTime >= singleTime) 
            {
                print("移动一次");
                currentTime = 0;
                Vector3 old = transform.position;
               // transform.Translate(transform.forward);
                //改变位置,产生位移的方法
                transform.position += transform.forward;
                if (firstBody != null) {
                    firstBody.GetComponent<SnakeBody>().Move(old);
                }
            }
            if (Input.GetKeyDown(KeyCode.A))
            {
                transform.Rotate(0,-90,0);
                print("a"+transform.forward);
            }
            else if (Input.GetKeyDown(KeyCode.D))
            {
                transform.Rotate(0, 90, 0);
                print("D" + transform.forward);
            }
            currentTime += Time.deltaTime;
        }
        //LinkedList链表:数据结构,设计模式
        //碰撞到食物,食物需要消失,蛇身体增加一个
        void OnTriggerEnter(Collider obj) {
            //销毁食物
            Destroy(obj.gameObject);
            //重新随机食物
            RandomFood();
            //加一个身体
            AddBody();
        }
        void AddBody() {
            GameObject body = GameObject.Instantiate(Body);
            if(firstBody==null)firstBody = body;
            else if (lastBody == null)
            {
                lastBody = body;
                firstBody.GetComponent<SnakeBody>().Next = body;
            }
            else {
                lastBody.GetComponent<SnakeBody>().Next = body;
                lastBody = body;
            }
            
        
        }
    } 
     
  • 相关阅读:
    深度学习笔记(21)- 深度看图
    Mysql数据库主键,外键,索引概述
    软件架构的演进:单体、垂直、SOA、微服务
    2018年阿里巴巴关于Java重要开源项目汇总
    全面了解HTTP和HTTPS
    创业互联网公司如何搭建自己的技术架构
    Dubbo与Spring Cloud的比较
    Java工程师技能点梳理
    使用SpringCloud将单体迁移至微服务
    Springmvc与Struts区别?
  • 原文地址:https://www.cnblogs.com/allyh/p/13725810.html
Copyright © 2020-2023  润新知