zoukankan      html  css  js  c++  java
  • unity3d入门 Demo 学习记录

      闲来学习一下 unity3d 的Demo,记录如下。

          官方 Demo,名字为 Roll-A-Ball,如图

      

      场景比较简单,包含地面、玩家精灵、主摄像机、墙壁、可拾取的方块、分数为示 text、平行光源。

      资源目录下,包含材质、预制件、脚本。

      材质:定义了背景、小方块所需的材质。

      预制件:场景中共有12个小方块,所以先做一个 PickUp 的预制件。制作一个预制件,先向场景中创建一个3d对象cube,为该cube对象添加钢体组件、脚本组件,然后把该 cube 对象拖进一个空的预制作,这样便可方批量创建,现在向场景再拖入11个该预制件。

      脚本:摄像机脚本、玩家精录脚本、自转脚本。脚本是这个小游戏灵魂,控制各移动逻辑,下面会详述。

    一、Rotator.cs 脚本绑定到小方块预制件:

    using UnityEngine;
    using System.Collections;

    public class Rotator : MonoBehaviour {
        // Before rendering each frame..
        void Update () 
        {
            // Rotate the game object that this script is attached to by 15 in the X axis,
            // 30 in the Y axis and 45 in the Z axis, multiplied by deltaTime in order to make it per second
            // rather than per frame.
            transform.Rotate (new Vector3 (15, 30, 45) * Time.deltaTime);
        }
    }    

    核心就一句代码,绑定该脚本的GameObject每秒 绕指定轴旋转。

    二、CameraController.cs脚本绑定到摄像机。

    using UnityEngine;
    using System.Collections;

    public class CameraController : MonoBehaviour {

        // store a public reference to the Player game object, so we can refer to it's Transform
        public GameObject player;

        // Store a Vector3 offset from the player (a distance to place the camera from the player at all times)
        private Vector3 offset;

        // At the start of the game..
        void Start ()
        {
            // Create an offset by subtracting the Camera's position from the player's position
            offset = transform.position - player.transform.position;
        }

        // After the standard 'Update()' loop runs, and just before each frame is rendered..
        void LateUpdate ()
        {
            // Set the position of the Camera (the game object this script is attached to)
            // to the player's position, plus the offset amount
            transform.position = player.transform.position + offset;
        }
    }

    在Start方法中,记下摄像机与玩家精灵的距离差值,在LateUpdate方法中更新摄像机的位置,使摄像机跟随玩家精录的移动。

    三、PlayerController.cs绑定到 player 对象。

    using UnityEngine;

    // Include the namespace required to use Unity UI
    using UnityEngine.UI;

    using System.Collections;

    public class PlayerController : MonoBehaviour {
        
        // Create public variables for player speed, and for the Text UI game objects
        public float speed;  //精灵移动速度
        public Text countText;//分数 Text
        public Text winText;//胜利 Text

        // Create private references to the rigidbody component on the player, and the count of pick up objects picked up so far
        private Rigidbody rb;//精灵本身绑定的钢体对像
        private int count;//分数记数

        // At the start of the game..
        void Start ()
        {
            // Assign the Rigidbody component to our private rb variable
            rb = GetComponent<Rigidbody>();//钢体对象附值

            // Set the count to zero 
            count = 0;//初始化分数

            // Run the SetCountText function to update the UI (see below)
            SetCountText ();//设置初始化文本

            // Set the text property of our Win Text UI to an empty string, making the 'You Win' (game over message) blank
            winText.text = "";
        }

        // Each physics step..  处理输入
        void FixedUpdate ()
        {
            // Set some local float variables equal to the value of our Horizontal and Vertical Inputs

      //取得键盘输入的 x 方向、y方向
            float moveHorizontal = Input.GetAxis ("Horizontal");
            float moveVertical = Input.GetAxis ("Vertical");


      //x 方向、y 方向组成方向向量
            // Create a Vector3 variable, and assign X and Z to feature our horizontal and vertical float variables above
            Vector3 movement = new Vector3 (moveHorizontal, 0.0f, moveVertical);

            // Add a physical force to our Player rigidbody using our 'movement' Vector3 above, 
            // multiplying it by 'speed' - our public player speed that appears in the inspector

      //给精灵的钢体对象一个该方向向量上的、大小为 speed 的力
            rb.AddForce (movement * speed);
        }

        // When this game object intersects a collider with 'is trigger' checked, 
        // store a reference to that collider in a variable named 'other'..

     //处理碰撞逻辑
        void OnTriggerEnter(Collider other) 
        {
            // ..and if the game object we intersect has the tag 'Pick Up' assigned to it..

      //与精灵碰撞的对象,如果 tag 是 Pick Up,那么隐藏,同时记数+1,更新文本显示
            if (other.gameObject.CompareTag ("Pick Up"))
            {
                // Make the other game object (the pick up) inactive, to make it disappear
                other.gameObject.SetActive (false);

                // Add one to the score variable 'count'
                count = count + 1;

                // Run the 'SetCountText()' function (see below)
                SetCountText ();
            }
        }

        // Create a standalone function that can update the 'countText' UI and check if the required amount to win has been achieved

     // 文本更新方法,胜利判定逻辑
        void SetCountText()
        {
            // Update the text field of our 'countText' variable
            countText.text = "Count: " + count.ToString ();

            // Check if our 'count' is equal to or exceeded 12
            if (count >= 12) 
            {
                // Set the text value of our 'winText'
                winText.text = "You Win!";
            }
        }
    }

  • 相关阅读:
    LeetCode506-相对名次
    LeetCode496-下一个更大的元素(遍历)
    Redis查询超时问题排查及原因分析
    SQL Server 输出消息
    SQL Server按时间分段统计数据
    C# 数据保存到Excel
    查看SQL Server数据库恢复进度
    输入百度网址地址后面有tn小尾巴解决办法
    SQL Server 查询数据大小
    Sping Boot + Spring Security + Mybaits + Logback +JWT验证 项目开发框架搭建
  • 原文地址:https://www.cnblogs.com/xingchong/p/9822512.html
Copyright © 2011-2022 走看看