学习unity3d的日记
2018-05-27 16:36:46 u010099177 阅读数 36

课时2

搭建场景, 核心技术是创建地形, 在地形上涂纹理, 放模型(树\房子等)

课时80  添加武器商人NPC

存在的问题

其中的Layer是什么 有什么作用

如何让UI root显示在窗口中

大概学到的技术

copy 音频组件, 添加鼠标点击时有声音

新建quad做图片背景

课时81  制作武器商人NPC窗口

武器窗口是一个2D的Sprite对象.  sprite与普通的Image相似, 只是image需要在Canvas下才能显示出来.

场景中的Sprite可以像普通的3D游戏物体一样对待,通过Transform组件进行移动等操作

Sprite可以指定图集Atlas.

关于Awake和Start:

  • Awake函数在所有的游戏对象被初始化完毕之后才会被调用;在脚本实例的整个生命周期中,Awake函数仅执行一次。
  • 当Update函数第一次被调用前会调用Start函数;Start函数只在脚本实例被启用时才会执行;Start函数总是在Awake函数之后执行。
本次课程的部分代码:
public class ShopWeaponUI : MonoBehaviour {

    public static ShopWeaponUI _instance;
    private TweenPosition tween;
    private bool isShow = false;

    void Awake() {
        _instance = this;
        tween = this.GetComponent<TweenPosition>();
    }

    public void TranformState() {
        if (isShow) {
            tween.PlayReverse();
            isShow = false;
        } else {
            tween.PlayForward();
            isShow = true;
        }
    }
}
如果一个图形是按钮, 就添加NGUI/Scripts/Interaction/UI Button.cs这个脚本. 里面有一个OnClick对象. 将ShopWeapon(是一个Sprite)拖动到上面, Notify里面就会列出该对象绑定的脚本类, Method会显示这个类的方法

遇到的问题:

窗口点会穿透, 没有效果.

课时88: 给环境添加碰撞器. 用一堆Cube将房子, 桥, 河流等围住, 防止人物.落下去.


课时90: 控制小狼被打中的效果

等待看的日志: https://blog.csdn.net/vr_ishow/article/details/65626888

2016-11-04 16:43:50 shengshengwang 阅读数 1444

1. Unity3D

解析:Unity3D可以让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。


2. Project(项目)视图

解析:Project(项目)视图主要存放游戏中用到的所有资源文件,常用的资源包括:游戏脚本、预设、材质、动画、自定义字体、纹理、物理材质和GUI皮肤等,这些资源需要赋予Hierarchy(层次)视图中的某些游戏对象。

(1)Folder:文件夹,用于资源的分类。

(2)Javascript:JavaScript脚本文件。

(3)C# Script:C#脚本文件。

(4)Boo Script:Boo脚本文件。

(5)Shader:设置一个着色器,可以用ShaderLab编写着色器代码。将着色器绑定在材质身上,可直接影响材质的显示效果。

(6)Prefab:预设,用于场景中游戏对象的克隆。使用预设,可以有效避免过多重复的游戏对象占用内存的情况。

(7)Material:材质,用于为模型添加颜色与贴图。

(8)Animation:游戏动画。

(9)Cubermap:创建具有六个面的贴图资源,用于立方体或天空盒子的贴图。

(10)Lens Flare:添加镜头光晕效果。

(11)Custom Font:自定义字体。

(12)Render Texture:渲染贴图。

(13)Physic Material:物理材质,用于调整对象的物理属性,比如摩擦力和弹力等。

(14)GUI Skin:图形用户界面,可以为多个控件添加样式。


3. Hierarchy(层次)视图  

解析:Hierarchy(层次)视图主要存放游戏场景中具体的游戏对象,比如摄像机、平面贴图、3D贴图、光源、箱

子、球体、胶囊体、模型、平面和地形等。任何一个全新的游戏工程创建完毕后,默认都会创建一个游戏场景并且将主摄像机添加在该场景的Hierarchy(层次)视图中。

(1)Particle System:粒子效果发射器,可处理游戏中的所有粒子效果。

(2)Camera:游戏摄像机。

(3)GUI Text:3D平面文字。

(4)GUI Texture:平面贴图。

(5)3D Text:3D立体文字。

(6)Directional Light:定向光源,常用于天空向地面定向投射的光源。

(7)Point Light:点光源,在一定范围内照亮的光源。

(8)Spotlight:聚光灯,与点光源类似,但光线只照亮一个圆锥区域。

(9)Area Light:区域灯,可照亮整个选定的区域。

(10)Cube:立方体。

(11)Sphere:球体。

(12)Capsule:胶囊体。

(13)Cylinder:圆柱体。

(14)Plane:平面。

(15)Cloth:布料。

(16)Audio Reverb Zone:音频效果。

(17)Ragdoll:布娃娃效果。

(18)Tree:树模型。

(19)Wind Zone:风向,可影响游戏中的对象。


4. Inspector(检测)视图

解析:Inspector(检测)视图是存放游戏对象、游戏资源、游戏设置以及展示描述信息的地方。

(1)Transform:模型的变化,通过它可动态修改立方体的三维坐标。Position:该立方体的位置。Rotation:该立方体的旋转角度。Scale:该立方体的缩放比例。

(2)Cube(Mesh Filter):网格过滤器的类型,它可以直接确定该模型的物理性质,这里默认为Cube。

(3)Box Collider:立方体碰撞器,它与刚体紧密结合。

(4)Mesh Render:网格的绘制,它可对网格进行材质的渲染。Cast Shadows:网格是否投射阴影。Receive 

Shadows:网格是否接收阴影。

(5)Materials:设置材质的资源。


5. Scene(场景)视图和Game(游戏)视图

解析:

(1)Scene(场景)视图主要存放游戏中的模型资源。

(2)Game(游戏)视图中显示的内容完全取决于摄像机所照射的部分。


6. 平台设定

解析:

(1)Resolution and Presentation:屏幕的尺寸以及位置等。

(2)Icon:程序的图标。

(3)Splash Image:开机预览图。

(4)Other Settings:其他设定,主要设置一些平台的相关特性。


7. Unity3D高级控件

解析:Label控件、Button控件、TextField控件、ToolBar控件、Slider控件、ScrollView控件、GroupView控件、Window控件等。


8. Unity3D摄像机

解析:Unity3D摄像机分为正交摄像机和透视摄像机两种。正交摄像机无论远近它的视口范围永远是固定的,但是透视摄像机是由原点向外扩散性发射,也就是距离越远它的视口区域也就越大。


9. HTC VIVE

解析:HTC Vive通过以下三个部分致力于给使用者提供沉浸式体验:一个头戴式显示器、两个单手持控制器、一个能于空间内同时追踪显示器与控制器的定位系统。


10. VR编程

解析:VR编程 = CUDA + DirectX + Unity3D + C# + 3DMAX。


11. Unity3D中的4种坐标系

解析:左手坐标系与右手坐标系,如下所示:


(1)世界坐标系:Unity3D采用的是左手坐标系。在Unity3D中可以使用transform.position来获取场景中一个物体的世界坐标,通常情况下编辑器中的Inspector窗口是以世界坐标来描述一个3D物体的位置的,除非当一个3D物体存在父物体的时候,它会以相对坐标来描述其位置。

(2)屏幕坐标系:屏幕坐标是以像素来定义的,它的范围是以左下角为(0, 0),右上角为(Screen.width, 

Screen.height)定义的这样一个矩形。屏幕坐标是一个3D坐标,Z轴是以相机的世界单位来衡量的。屏幕坐标和相机之间满足:Screen.width=Camera.pixelWidth和Screen.height=Camera.pixelHeight这两个条件。需要说明的是鼠标位置和手指触摸屏幕都是屏幕坐标。

(3)视图坐标系:视图坐标是标准化后的屏幕坐标,视图坐标是以0到1间的数字来表示的,它的范围是以左下角为(0, 0),右上角为(1, 1)定义的这样一个矩形。视图坐标是一个3D坐标,Z轴是以相机的世界单位来衡量的。 

(4)GUI坐标系:GUI坐标是指通过OnGUI方法绘制UI时使用的坐标。这个坐标系和屏幕坐标类似,它同样是以像素来定义的,它的范围是以左上角为(0, 0),右下角为(Screen.width, Screen.height)定义的这样一个矩形,GUI坐标是一个2D坐标(绝对坐标)。

四种坐标系的转换,如下所示:

(1)世界坐标 -> 屏幕坐标:camera.WorldToScreenPoint(transform.position);

(2)屏幕坐标 -> 视图坐标:camera.ScreenToViewportPoint(Input.GetTouch(0).position);

(3)视图坐标 -> 屏幕坐标:camera.ViewportToScreenPoint();

(4)视图坐标 -> 世界坐标:camera.ViewportToWorldPoint();

说明:camera为场景中的camera对象。


12. VR关键技术

解析:VR关键技术的发展以虚拟环境的表现,人与虚拟环境的交互为重点。虚拟环境的表现,如下所示:

(1)360 Video:“忠实记录”,全景拍摄,固定用户位置的中心视角,最先成熟在线商用。

(2)自由视角视频:“虚实结合”,环绕拍摄和建模计算结合,可改变用户位置的自由视角,实际视角和虚拟视角结合,有实验产品,未规模商用。

(3)计算机图像学:“无中生有”,建模计算渲染虚拟实体,计算量大,目前以本地应用为主。

(4)光场:“以假乱真”,记录光线强度和角度信息,信息量远大于传统媒体,出现部分试验性产品。

人与虚拟环境的交互包括位置固定,动作捕捉等关键技术。如下所示:

(1)位置定位实现用户和虚拟环境的融合。

(2)动作捕捉建立用户和虚拟环境之间的连接。


13. 变换工具

解析:

(1)手柄工具(快捷键Q):按住左键拖动视角。

(2)移动工具(快捷键W):首先选择物体,物体会出现方向轴,拖动方向轴移动物体。

(3)旋转工具(快捷键E):首先选择物体,物体会出现转转轴,拖动旋转轴旋转物体。

(4)缩放工具(快捷键R):首先选择物体,物体会出现缩放方向轴,拖动可缩放物体大小。


14. 预设(Prefab) 

解析:预设(Prefab)是一种资源 - 存储在工程视图(Project View)中可重复使用的游戏对象(GameObject)。预设(Prefabs)可放入到多个场景中,且每个场景可使用多次。向场景添加一个预设(Prefab)时,就会创建它的一个实例。所有预设(Prefab)实例都链接到原始预设(Prefab),实质上是原始预设的克隆。不管工程中有多少个实例,对预设(Prefab)作出任何更改时,将会看到这些更改应用于所有实例。


15.Shader Language

解析:Shader Language目前有3种主流语言:基于OpenGL的GLSL(OpenGL Shading Language),基于Direct3D的HLSL(High Level Shading Language),还有NVIDIA公司的Cg(C for Graphic)语言。


16.Shader IDE

解析:

(1)Render Monkey

(2)NVIDIA FX Composer

(3)Shader Designer


参考文献:

[1] 《Unity3D游戏开发

[2] 说说Unity3D里的各种坐标系:http://blog.csdn.net/kingsea168/article/details/49611285

[3] Unity3D四种坐标系:http://www.360doc.com/content/14/0122/16/12282510_347142356.shtml

[4] 3D和2D游戏开发技术里的坐标系总结:http://blog.csdn.net/kafeidev/article/details/42780009

2016-06-05 23:27:22 axlxzero 阅读数 440

最近的内容主要是关于脚本与其他组件的关系。

关于组件的生命周期:

//出生时即执行,脚本被加载时调用一次

//Awake中做一些初始化操作

void Awake(){

//初始化public成员

 

//当对象开始时执行

void Start () {}

//每一帧都会执行

void Update () {

//一般每秒60帧,可以认为1秒调用60}

 

//Update方法调用之后调用

void LateUpdate(){

}

 

//在对象销毁时执行

void OnDestroy(){}

 

//在启用脚本时执行

void OnEnable(){

//可能需要在重新激活时重置的变量}

 

//在被不启用时执行

void Disable(){}

 

//持续调用

Void OnGUI(){

//IMGUI代码需要写在OnGUI方法中}

 

//以固定的频率调用,与图像的刷新帧速率无关

Void FixedUpdate(){

//处理物理的代码放在这里,放在update中可能因为卡顿导致问题}

 

//这些方法并不是继承自MonoBehaviour,而是通过反射调用的一些事件

//这些方法定义了一个脚本从被加载到被销毁的过程中脚本的生命周期

 

当然这些都是比较常用的,在官方manual中还有一张更详细的生命周期图。

 

以下是一部分关于脚本组件代码中的笔记:

每一个脚本类都继承自MonoBehaviour类,这些类叫做运行时类,不能手动实例化(仅受到Unity的控制)

gameObject //获取当前脚本挂载到的游戏对象

Unity中就算使用了C#进行编写脚本,要输出时不能使用Console类,应当使用print();或者Debug.log();

transform表示该脚本挂载的游戏对象身上的transform组件

Transform.position //获取transform身上的各种属性,其他组件的其他属性同理

使用public在类中定义变量可以在unity属性面板中调节

GetComponent<>();//使用泛型的方法获取当前游戏对象上指定类型的组件对象

AddComponent<>(); //为当前游戏对象添加指定组件

 

随便写点:

void Start () {
print("print脚本挂载到了"+gameObject.name+"的身上");
        gameObject.AddComponent<ParticleSystem>();//为当前对象添加一个粒子系统
        ParticleSystem ps = gameObject.GetComponent<ParticleSystem>();//查询到这个粒子系统
        Destroy(ps);//删除该粒子系统
  
	}

using UnityEngine;
using System.Collections;
//使得一个对象的z轴看向目标lookat
public class LookAt : MonoBehaviour {

    public Transform lookat;
	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
        gameObject.transform.LookAt(lookat);
	}
}


2016-04-20 11:44:05 begonia__z 阅读数 5977

这里有很多小伙伴可能不知道啥事贝塞尔曲线是啥玩意,如果你用过PS的钢笔功能就知道这是啥,如果还是不知道这是啥那么说一个游戏你就知道了“愤怒的小鸟”这个游戏用到弹弓效果可以用这个贝塞尔曲线来实现。还不知道的话拿自己去百度谷歌,这个是游戏很常用到的一个画曲线的函数方式。

那么我们要实现贝塞尔曲线函数要怎么弄了,别把贝塞尔曲线想的太难,其实如果你懂得怎么贝塞尔曲线的公式怎么写,那么这个其实将数学公式转化成代码语言就行了。那么我们先去看看贝塞尔曲线公式有哪些,下图是百度百科对贝塞尔曲线的介绍并且其中还包括公式,有兴趣的娃可以去百科看看这些介绍,地址如下:点击打开链接


从上图我们可以看出大体上用法有3种,如果看不懂这些不要紧,这里我们把P1,P2等可以看作参数,t可以看作一个0-1的参数这样将其化作简单代码语言来看待,那么我们可以根据参数多少大体知道有3个不同的参数的函数。接下来我们继续往下把贝塞尔曲线函数实现出来,这里写成了静态函数方便调用,因为很简单所以就直接上代码了,如果连将数学公式转化为简单的代码语言都不会,怎么你可要慎重考虑是否适合做这行了,代码如下:

using UnityEngine;

[System.Serializable]
public class Bezier : System.Object
{
    /// <summary>
    /// 线性贝赛尔曲线
    /// </summary>
    /// <param name="P0"></param>
    /// <param name="P1"></param>
    /// <param name="t"> 0.0 >= t <= 1.0 </param>
    /// <returns></returns>
    public static Vector3 BezierCurve(Vector3 P0, Vector3 P1, float t)
    {
        Vector3 B = Vector3.zero;
        float t1 = (1 - t);
        B = t1*P0 + P1*t;
        //B.y = t1*P0.y + P1.y*t;
        //B.z = t1*P0.z + P1.z*t;
        return B;
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="P0"></param>
    /// <param name="P1"></param>
    /// <param name="P2"></param>
    /// <param name="t">0.0 >= t <= 1.0 </param>
    /// <returns></returns>
    public static Vector3 BezierCurve(Vector3 P0, Vector3 P1, Vector3 P2, float t)
    {
        Vector3 B = Vector3.zero;
        float t1 = (1 - t)*(1 - t);
        float t2 = t*(1 - t);
        float t3 = t*t;
        B = P0*t1 + 2*t2*P1 + t3*P2;
        //B.y = P0.y*t1 + 2*t2*P1.y + t3*P2.y;
        //B.z = P0.z*t1 + 2*t2*P1.z + t3*P2.z;
        return B;
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="P0"></param>
    /// <param name="P1"></param>
    /// <param name="P2"></param>
    /// <param name="P3"></param>
    /// <param name="t">0.0 >= t <= 1.0 </param>
    /// <returns></returns>
    public static Vector3 BezierCurve(Vector3 P0, Vector3 P1, Vector3 P2, Vector3 P3, float t)
    {
        Vector3 B = Vector3.zero;
        float t1 = (1 - t)*(1 - t)*(1 - t);
        float t2 = (1 - t)*(1 - t)*t;
        float t3 = t*t*(1 - t);
        float t4 = t*t*t;
        B = P0*t1 + 3*t2*P1 + 3*t3*P2 + P3*t4;
        //B.y = P0.y*t1 + 3*t2*P1.y + 3*t3*P2.y + P3.y*t4;
        //B.z = P0.z*t1 + 3*t2*P1.z + 3*t3*P2.z + P3.z*t4;
        return B;
    }
}
一般公式是教你怎么使用公式,这里我们可以忽略掉的。这里要注意的是,我们是通过t来绘制到曲线的每一个点位置,但是要记得t是一个0到1值,所以可以利用for循环来绘制所需要的点,大体用法就如图所示:


这里要感谢Momo大神,界面大部分代码都是用Momo写个那个案例,原文地址:点击打开链接

最后的效果如图显示:


2016-05-18 21:21:53 axlxzero 阅读数 542

从下定决心到开始了解并且学习UNITY3D已经大概有了2个星期了,今天决定开始在晚上敲敲键盘,写点东西,一方面是稍微记录一下学习的过程,方面日后查阅以及回顾,另一方面也是想要持续督促自己,更加有动力学习下去。写的东西不免有流水账,不免十分幼稚,但仅仅是希望能够做个记录罢了。

现在是大三的第二个学期,我最终还是决定进入游戏行业进行打拼。在刚开学时心存侥幸,希望能够通过成为游戏策划从而绕过编程这方面,前前后后忙活了一个月参与各种简历投递、笔试、面试,为的是获得一份暑期游戏策划的实习生名额。4月底的一个下午,我坐在从广州回西安的飞机上,回想早晨在网易大厦进行终面的全部过程,我才意识到,做策划真的很难,入行难、竞争难。3天之后不出意料,并没能获得offer。于是决定开始静下心来,学习一种游戏引擎的使用,脚踏实地,开始从自己手里做想要的游戏。

决定开始学习Unity3d,毕竟这是目前最为火热的游戏引擎,不论独立游戏开发者或是网络手游公司都在用它,说明好用!

回到学校用了3天晚上看了C#的基础内容,这3天煞有介事地用记事本做着笔记,照着视频敲着代码,但最终没看完。决定直接开始学习Unity软件本身。


(煞有介事的C#知识笔记)

大概用了4天,通过视频了解了unity的整个界面以及基本的用法。我找的这套视频节奏比较慢,刚开始时又讲的比较稀疏(大概只是为了介绍整个的概况吧),我大概全程是用1.5倍速看的。

从第5天开始接触场景的搭建和一些最简单的脚本的写法,当然还了解了一点点关于GUI的知识。


(照着视频试图搭建出一个海岛的效果,最终感觉还不如某些游戏随机生成的地图。。)


(用3rd person controller视角看到的场景)

接下来是一个简单的控制游戏对象移动的脚本,wsad前后左右移动,qe转向,再为该对象加上一个跟随镜头就可以实现一个基本的RPG游戏控制角色的效果。

using UnityEngine;
using System.Collections;

public class MoveSrcipt : MonoBehaviour {
    GameObject go;
    public float speed = 0;
    float y=0;
    Quaternion rotateTo;
	void Start () {
        go = this.gameObject;
	}
	
	// Update is called once per frame
	void Update () {
        if (Input.GetKey("w"))
        {
            go.transform.Translate(Vector3.forward*Time.deltaTime*speed);
        }
        if (Input.GetKey("s"))
        {
            go.transform.Translate(Vector3.back * Time.deltaTime * speed);
        }
        if (Input.GetKey("a"))
        {
            go.transform.Translate(Vector3.left * Time.deltaTime * speed);
        }
        if (Input.GetKey("d"))
        {
            go.transform.Translate(Vector3.right * Time.deltaTime * speed);
        }
        if (Input.GetKey("q"))
        {
            y = -Time.deltaTime * speed * 15;
        }
        else if (Input.GetKey("e"))
        {
            y = Time.deltaTime * speed * 15;
        }
        else y = 0;
        go.transform.Rotate(new Vector3(0,y,0));
        
        go.transform.rotation = Quaternion.Slerp(go.transform.rotation, rotateTo, Time.deltaTime);//使用插值实现平滑转动
	}
}

没有更多推荐了,返回首页