闲来学习一下 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!";
        }
    }
}

unity3d入门 Demo 学习记录的更多相关文章

  1. Python入门基础学习记录(二)汇率案例学习记录

    一.汇总整理 1.操作 ①新建python文件 工程右键--new--python file 2.注意问题与知识点 >变量定义:直接写变量名即可,例如定义一个字符串并赋值123: rmb_str ...

  2. [Unity3D]做个小Demo学习Input.touches

    [Unity3D]做个小Demo学习Input.touches 学不如做,下面用一个简单的Demo展示的Input.touches各项字段,有图有真相. 本项目已发布到Github,地址在(https ...

  3. Vue学习记录第一篇——Vue入门基础

    前面的话 Vue中文文档写得很好,界面清爽,内容翔实.但文档毕竟不是教程,文档一上来出现了大量的新概念,对于新手而言,并不友好.个人还是比较喜欢类似于<JS高级程序设计>的风格,从浅入深, ...

  4. 《java从入门到精通》学习记录

    目录 <Java从入门到精通>学习记录 3 基础的基础部分: 3 一. 常量与变量 3 1. 掌握: 3 (1) .常量与变量的声明方式: 3 (2) .变量的命名规则: 3 (3) .变 ...

  5. Git学习记录 力做全网最强入门教程

    目录 Git学习记录 力做全网最强入门教程 什么是GitHub? 什么是Git? Git的配置 Git的安装(只介绍windos操作系统下) Git的配置 至此我们的入门教程到此结束,更新中级教程要等 ...

  6. Unity3D Adam Demo的学习与研究

      1.简述 这篇文章是对Adam各种相关资料了解后进行一些精简的内容.如果你想仔细研究某个技术请跳转至unity相关页面. Adam官方页面: https://unity3d.com/cn/page ...

  7. redis入门学习记录(二)

    继第一节 redis入门学习记录(一)之后,我们来学习redis的基本使用. 接下来我们看看/usr/local/redis/bin目录下的几个文件作用是什么? redis-benchmark:red ...

  8. Elasticsearch学习记录(入门篇)

    Elasticsearch学习记录(入门篇) 1. Elasticsearch的请求与结果 请求结构 curl -X<VERB> '<PROTOCOL>://<HOST& ...

  9. 我的three.js学习记录(二)

    通过上一篇文章我的three.js学习记录(一)基本上是入门了three.js,但是这不够3D,这次我希望能把之前做的demo弄出来,然后通过例子来分析操作步骤. 1. 示例 上图是之前做的一个dem ...

随机推荐

  1. 思维题——牛客多校第六场D

    这题的不能用二分做,因为不满足单调性的 可以用multiset做 #include<bits/stdc++.h> #define ll long long #define rep(i,a, ...

  2. vue-组件之间的通信:

    组件之间的通信:一个组件被调用,那么里面的数据就需要从前者调用,因为在开发中组件时重复调用的,在页面中会反复使用,但是里面的数据是不一样的,谁调用这个组件谁就传递数据给这个组件,所以就要暴露一些接口, ...

  3. HDU5923-Prediction-有继承味道的并查集

    目录 目录 思路: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 目录 题意:传送门  原题目描述在最下面.  有一个n个节点m条边的无向图和一个m个节点的有根树(根为1).树上每 ...

  4. 剑指offer——34之字打印二叉树

    题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推.   题解: 与上道题没区别,就是在存入数据时 ...

  5. 在html页面引用css文件的方法

    引用CSS文件到Html方法-css引入,css引用 使用不同的方法来引用css样式表,最终到达的效果相同,但是使用不同方法应用的css文件将影响到SEO及网页打开速度效率. html引用css方法如 ...

  6. linux下使用scp在服务器之间拷贝文件 (转载)

    CentOS, 本地服务器,ip: 192.168.1.111Ubuntu, 远程服务器,ip: 192.168.1.112 1.拷贝远程服务器的目录到本地服务器远程服务器192.168.1.112上 ...

  7. 18-Ubuntu-文件和目录命令-创建文件和目录-touch和mkdir

    1.touch 创建文件或修改文件时间 (1)如果文件不存在,可以创建一个空白文件 例: 创建空白文件01.txt touch 01.txt (2)如果文件已经存在,可以修改文件的末次修改时间 例: ...

  8. importError:cannot import name imsave/imread等模块

    首先要先看相应的库是否已经安裝成功 pip install numpy pip install pillow pip install scipy 都成功安装之后,执行: import scipy.mi ...

  9. 客户端IAP二次验证

    1.首先苹果IAP把每次购买抽象成了一个事务(SKPaymentTransaction), - (void)productsRequest:(SKProductsRequest *)request d ...

  10. 第一个Vus.js

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...