【Unity3d】学习笔记(2)

本文是Unity3d学习笔记的第二部分,主要介绍了使用Animator Controller控制角色动画,Input处理用户输入,刚体Rigidbody实现物理交互,以及FixedUpdate、Time.deltaTime在游戏逻辑中的应用。此外,还涉及到了层(Layer)、蒙皮网格渲染器、射线(Ray)、粒子系统(Particle System)、LineRenderer和Light的初步使用。
摘要由CSDN通过智能技术生成

【Unity3d】学习笔记(2)

目录

前言

我学习Unity3d的方法是通过实战案例来学习,碰到不知道的概念在反过来查找并理解概念的意思。我认为这样比单纯的了解一大堆概念之后在开始实践要更有趣,更有动力,理解也更深。但是,同时我也认为这种方法比较适合有一些编程经验的人,一些程序设计的通用概念你可能已经驾轻就熟,而Unity特有的概念可能与你熟知的概念有相似性,关联他们,有助于你加深理解。

正文

今天开始学习3D游戏的案例,教程是泰课在线的NightmaresShooter。我同样将自己的工程上传到了GitHub。由于这次使用的assets是unity官方教程SurvivalShooter里的package包,所以我上传到GitHub里的assets便没有ignore掉了这些公共资源。package可以从assets store中下载,也可以用泰课在线提供的。

今天遇到了许多unity中的概念:

  • 动画器控制器 (Animator Controller)
  • Input
  • 刚体 (Rigidbody)
  • FixedUpdate
  • Time.deltaTime
  • * 层(Layer)*
  • Awake
  • 蒙皮的网格渲染器SkinnedMeshRenderer)
  • * 射线(Ray)*
  • * 粒子系统(Particle System)*
  • LineRenderer
  • Light

动画器控制器 (Animator Controller)

我们的主角有三个动画效果,对应三种状态:Idel,Walking,Dead。我们通过Animator Controller来控制动画。我们在Animation文件夹下创建一个Animator Controller,这会在磁盘上创建.controller资源,将其添加到主角的component堆中。打开Animator视图(Window->Animator)。将Assets中的三段动画拖入该视图(请注意,只能将 Mecanim 动画拖动到控制器中 - 非 Mecanim 动画会被拒绝。),这视图中自动生成该动画资源对应的动画状态(Animation State),设置他们的动画转换(Animation Transition)如图:
这里写图片描述
创建两个Parameters来限制Transition的转换条件。

注意:
动画器控制器窗口 (Animator Controller Window) 会始终显示最近选择的 .controller 资源中的状态机(与当前加载的场景无关)。也就是说即便切换场景,动画控制器窗口不变。

更多关于动画器控制器 (Animator Controller)的信息可以直接通过官方文档查看。

Input

Input是unity用来处理用户输入的类。可以响应键盘、鼠标和游戏杆(joystick)的输入。教程中有两处用到了Input,这里只简述这两处用法。

//Control Moveing
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis ("Vertical");
//      transform.Translate (new Vector3 (h, 0, v) * speed * Time.deltaTime);
        GetComponent<Rigidbody>().MovePosition (transform.position + new Vector3 (h, 0, v) * speed * Time.deltaTime);

在处理角色移动时,使用Input.GetAxis方法通过axisName(轴名)获取虚拟的轴标识。响应键盘和游戏杆输入的返回值介于-1到1之间。我们通过获取该值来处理游戏响应。

if (Input.GetMouseButtonDown (0)) {
            TakeDamage(30f);
        }

此处使用鼠标点击输入来验证对角色造成伤害的方法。Input.GetMouseButtonDown在鼠标对应键按下时返回真,对应关系可以看看官方的代码:

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void Update() {
        if (Input.GetMouseButtonDown(0))
            Debug.Log("Pressed left click.");

        if (Input.GetMouseButtonDown(1))
            Debug.Log("Pressed right click.");

        if (Input.GetMouseButtonDown(2))
            Debug.Log("Pressed middle click.");

    }
}

更多详细信息可参考官方文档。建议查看此脚本参考而非手册。

刚体 (Rigidbody)

我们为角色添加了一个刚体组件和一个胶囊碰撞器组件来实现角色与环境的碰撞检测。
刚体 (Rigidbody) 使游戏对象 (GameObject) 在物理控制之下行动。刚体 (Rigidbody) 可以接收力和扭矩以使对象采用逼真方式移动。任何游戏对象 (GameObject) 必须包含刚体 (Rigidbody) 才能受重力影响、在添加的力作用下行动(通过脚本)或是与其他对象交互(通过 NVIDIA PhysX 物理引擎)。

更多关于刚体的信息可查看官方文档

FixedUpdate

FixedUpdate方法应该在处理刚体时用于替换Update方法。在教程中使用的Update方法起作用后,我自己的工程并没能实现相应功能,修改为FixedUpdate方法后则实现了。

更多关于FixedUpdate的信息可查看官方文档

Time.deltaTime

deltaTime变量是时间类的一个重要变量,他记录了自上一次更新语句执行完成所花费的时间。通过deltaTime变量的使用,我们可以使物体的变化以一种恒定的速度来进行,而不受帧速率或计算机性能的影响,这样语句在不同性能的机器上执行起来,其执行速度都是相同的。

更多关于Time.deltaTime的信息可查看官方文档

层(Layer)

Layer是GameObject的公共属性,范围是0到31。教程中使用Layer是为了实现射线碰撞检测(RayCast)。使用GetMask可以获取相应的索引值。

groundLayerIndex = LayerMask.GetMask("Ground");

更多关于层(Layer)的信息可查看官方文档

Awake

脚本实例正在加载时将调用Awake函数。用于游戏开始前初始化变量。Awake函数早于任何Start函数之前调用。
关于Awake的更多信息可参考官方文档

蒙皮的网格渲染器(SkinnedMeshRenderer)

当导入有蒙皮的网格时,骨骼蒙皮渲染器会自动添加到导入的网格。

bodyRenderer = transform.Find ("Player").GetComponent<Renderer>() as SkinnedMeshRenderer;
bodyRenderer.material.color = Color.Lerp (bodyRenderer.material.color, Color.white, smoothing * Time.deltaTime);

(实际代码位置以GitHub上的为准,此处演示用法)

关于蒙皮的网格渲染器的更多信息可参考官方文档

射线(Ray)

游戏中使用射线碰撞来实现角色的方向转换:

        //Control Rotation
        Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
        RaycastHit hitInfo;
        if (Physics.Raycast (ray, out hitInfo, 200f, groundLayerIndex)) {
            Vector3 target = hitInfo.point;
            target.y = transform.position.y;
            transform.LookAt(target);
        }

其中:
target.y = transform.position.y;
是为了让target点和角色在同一水平上。这条射线到底是怎样的呢?官方的实例图有助于你理解:
这里写图片描述

关于射线(Ray)的更多信息可参考Unity圣典

粒子系统(Particle System)

Unity 中的粒子系统用于制造烟、蒸汽、火和其他气氛效果。教程中用到了一个枪口火光特效的粒子系统。只是简单的获取并播放了一下,如果有更复杂的用法,等遇到了再说。

particleSystem = this.GetComponentInChildren<ParticleSystem> ();//获取粒子系统组件
particleSystem.Play ();//播放效果

(实际代码位置以GitHub上的为准,此处演示用法)

关于粒子系统的更多信息可参考官方文档

LineRenderer

教程中使用线渲染器实现弹道效果。线渲染器 (Line Renderer) 在三维空间中有一个包含两个或更多点的数组,并在每两点之间绘制一条直线。因此,一个单独的“线渲染器”(Line Renderer) 组件 (Component) 便可用于绘制从简单直线到复杂螺旋线的任何东西。这些线是一直连续的;如果您需要绘制两条或更多条完全间断的线,则需要使用多个游戏对象 (GameObject),每个游戏对象都有自己的线渲染器 (Line Renderer)。“线渲染器”(Line Renderer) 并不渲染一个像素宽的线。它渲染有宽度和纹理的布告板线。

lineRenderer = this.GetComponent<LineRenderer> () as LineRenderer;
lineRenderer.enabled = true;
        lineRenderer.SetPosition (0, transform.position);
        Ray ray = new Ray (transform.position, transform.forward);
        RaycastHit hitInfo;
        if (Physics.Raycast (ray, out hitInfo)) {
            lineRenderer.SetPosition (1, hitInfo.point);
        } else {
            lineRenderer.SetPosition(1,transform.position + transform.forward*100);
        }

(实际代码位置以GitHub上的为准,此处演示用法)

更多关于线渲染器的信息可参考官方文档

Light

灯光 (Light) 会使您的游戏具有自己的个性和风格。您可以使用灯光来照亮场景和对象,以创建完美的视觉氛围。仅举几个例子,灯光可用于模拟太阳、燃烧的火柴光、手电筒、炮火或爆炸。教程中用灯光实现枪口发光特效。

更多关于灯光的信息可参考官方文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值