2014-10-13 18:41:30 book_longssl 阅读数 1108
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4714 人正在学习 去看看 张刚


 

下面我们开始今天。 我们学习目标:让U3D初学者可以更快速的掌握U3D技术,自行制作修改素材,可以独立完成2D、3D小规模游戏及网页游戏开发。

[csharp] view plaincopy

 

  1. using System;  

  2. using System.Runtime.InteropServices;  

  3. using UnityEngine;  

  4. public class WindowMod : MonoBehaviour  

  5. {  

  6.     public enum appStyle  

  7.     {  

  8.         FullScreen,  

  9.         WindowedFullScreen,  

  10.         Windowed,  

  11.         WindowedWithoutBorder  

  12.     }  

  13.     public enum zDepth  

  14.     {  

  15.         Normal,  

  16.         Top,  

  17.         TopMost  

  18.     }  

  19.     private const uint SWP_SHOWWINDOW = 64u;  

  20.     private const int GWL_STYLE = -16;  

  21.     private const int WS_BORDER = 1;  

  22.     private const int GWL_EXSTYLE = -20;  

  23.     private const int WS_CAPTION = 12582912;  

  24.     private const int WS_POPUP = 8388608;  

  25.     private const int SM_CXSCREEN = 0;  

  26.     private const int SM_CYSCREEN = 1;  

  27.     public WindowMod.appStyle AppWindowStyle = WindowMod.appStyle.WindowedFullScreen;  

  28.     public WindowMod.zDepth ScreenDepth;  

  29.     public int windowLeft = 10;  

  30.     public int windowTop = 10;  

  31.     public int windowWidth = 800;  

  32.     public int windowHeight = 600;  

  33.     private Rect screenPosition;  

  34.     private IntPtr HWND_TOP = new IntPtr(0);  

  35.     private IntPtr HWND_TOPMOST = new IntPtr(-1);  

  36.     private IntPtr HWND_NORMAL = new IntPtr(-2);  

  37.     private int Xscreen;  

  38.     private int Yscreen;  

  39.     private int i;  

  40.     [DllImport("user32.dll")]  

  41.     private static extern IntPtr GetForegroundWindow();  

  42.     [DllImport("user32.dll", CharSet = CharSet.Auto)]  

  43.     public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hPos, int x, int y, int cx, int cy, uint nflags);  

  44.     [DllImport("User32.dll")]  

  45.     private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);  

  46.     [DllImport("User32.dll")]  

  47.     private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);  

  48.     [DllImport("User32.dll")]  

  49.     private static extern int GetWindowLong(IntPtr hWnd, int dwNewLong);  

  50.     [DllImport("User32.dll")]  

  51.     private static extern bool MoveWindow(IntPtr hWnd, int x, int y, int width, int height, bool repaint);  

  52.     [DllImport("user32.dll", CharSet = CharSet.Auto)]  

  53.     public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);  

  54.     [DllImport("user32.dll", CharSet = CharSet.Auto)]  

  55.     public static extern int SendMessage(IntPtr hwnd, int msg, IntPtr wP, IntPtr IP);  

  56.     [DllImport("user32.dll", CharSet = CharSet.Auto)]  

  57.     public static extern IntPtr SetParent(IntPtr hChild, IntPtr hParent);  

  58.     [DllImport("user32.dll", CharSet = CharSet.Auto)]  

  59.     public static extern IntPtr GetParent(IntPtr hChild);  

  60.     [DllImport("User32.dll")]  

  61.     public static extern IntPtr GetSystemMetrics(int nIndex);  

  62.     private void Start()  

  63.     {  

  64.         this.Xscreen = (int)WindowMod.GetSystemMetrics(0);  

  65.         this.Yscreen = (int)WindowMod.GetSystemMetrics(1);  

  66.         if (this.AppWindowStyle == WindowMod.appStyle.FullScreen)  

  67.         {  

  68.             Screen.SetResolution(this.Xscreen, this.Yscreen, true);  

  69.         }  

  70.         if (this.AppWindowStyle == WindowMod.appStyle.WindowedFullScreen)  

  71.         {  

  72.             Screen.SetResolution(this.Xscreen - 1, this.Yscreen - 1, false);  

  73.             this.screenPosition = new Rect(0f, 0f, (float)(this.Xscreen - 1), (float)(this.Yscreen - 1));  

  74.         }  

  75.         if (this.AppWindowStyle == WindowMod.appStyle.Windowed)  

  76.         {  

  77.             Screen.SetResolution(this.windowWidth, this.windowWidth, false);  

  78.         }  

  79.         if (this.AppWindowStyle == WindowMod.appStyle.WindowedWithoutBorder)  

  80.         {  

  81.             Screen.SetResolution(this.windowWidth, this.windowWidth, false);  

  82.             this.screenPosition = new Rect((float)this.windowLeft, (float)this.windowTop, (float)this.windowWidth, (float)this.windowWidth);  

  83.         }  

  84.     }  

  85.     private void Update()  

  86.     {  

  87.         if (this.i < 5)  

  88.         {  

  89.             if (this.AppWindowStyle == WindowMod.appStyle.WindowedFullScreen)  

  90.             {  

  91.                 WindowMod.SetWindowLong(WindowMod.GetForegroundWindow(), -16, 369164288);  

  92.                 if (this.ScreenDepth == WindowMod.zDepth.Normal)  

  93.                 {  

  94.                     WindowMod.SetWindowPos(WindowMod.GetForegroundWindow(), this.HWND_NORMAL, (int)this.screenPosition.x, (int)this.screenPosition.y, (int)this.screenPosition.width, (int)this.screenPosition.height, 64u);  

  95.                 }  

  96.                 if (this.ScreenDepth == WindowMod.zDepth.Top)  

  97.                 {  

  98.                     WindowMod.SetWindowPos(WindowMod.GetForegroundWindow(), this.HWND_TOP, (int)this.screenPosition.x, (int)this.screenPosition.y, (int)this.screenPosition.width, (int)this.screenPosition.height, 64u);  

  99.                 }  

  100.                 if (this.ScreenDepth == WindowMod.zDepth.TopMost)  

  101.                 {  

  102.                     WindowMod.SetWindowPos(WindowMod.GetForegroundWindow(), this.HWND_TOPMOST, (int)this.screenPosition.x, (int)this.screenPosition.y, (int)this.screenPosition.width, (int)this.screenPosition.height, 64u);  

  103.                 }  

  104.                 WindowMod.ShowWindow(WindowMod.GetForegroundWindow(), 3);  

  105.             }  

  106.             if (this.AppWindowStyle == WindowMod.appStyle.Windowed)  

  107.             {  

  108.                 if (this.ScreenDepth == WindowMod.zDepth.Normal)  

  109.                 {  

  110.                     WindowMod.SetWindowPos(WindowMod.GetForegroundWindow(), this.HWND_NORMAL, 0, 0, 0, 0, 3u);  

  111.                     WindowMod.SetWindowPos(WindowMod.GetForegroundWindow(), this.HWND_NORMAL, 0, 0, 0, 0, 35u);  

  112.                 }  

  113.                 if (this.ScreenDepth == WindowMod.zDepth.Top)  

  114.                 {  

  115.                     WindowMod.SetWindowPos(WindowMod.GetForegroundWindow(), this.HWND_TOP, 0, 0, 0, 0, 3u);  

  116.                     WindowMod.SetWindowPos(WindowMod.GetForegroundWindow(), this.HWND_TOP, 0, 0, 0, 0, 35u);  

  117.                 }  

  118.                 if (this.ScreenDepth == WindowMod.zDepth.TopMost)  

  119.                 {  

  120.                     WindowMod.SetWindowPos(WindowMod.GetForegroundWindow(), this.HWND_TOPMOST, 0, 0, 0, 0, 3u);  

  121.                     WindowMod.SetWindowPos(WindowMod.GetForegroundWindow(), this.HWND_TOPMOST, 0, 0, 0, 0, 35u);  

  122.                 }  

  123.             }  

  124.             if (this.AppWindowStyle == WindowMod.appStyle.WindowedWithoutBorder)  

  125.             {  

  126.                 WindowMod.SetWindowLong(WindowMod.GetForegroundWindow(), -16, 369164288);  

  127.                 if (this.ScreenDepth == WindowMod.zDepth.Normal)  

  128.                 {  

  129.                     WindowMod.SetWindowPos(WindowMod.GetForegroundWindow(), this.HWND_NORMAL, (int)this.screenPosition.x, (int)this.screenPosition.y, (int)this.screenPosition.width, (int)this.screenPosition.height, 64u);  

  130.                 }  

  131.                 if (this.ScreenDepth == WindowMod.zDepth.Top)  

  132.                 {  

  133. &


2016-12-17 09:50:23 BuladeMian 阅读数 1835
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4714 人正在学习 去看看 张刚

当工程文件使用的图片过多的时候,就需要图片打包成一个大图,程序就只用预加载这一个大图,就节省了程序运行时间,提高了效率



2D图片打包图集有几种工具:2D ToolKit、TexturePacker Importer、UGUI、NGUI都可以打包

由于NGUI的功能涵盖较为完善,可以给独立开发者节省大量关于UI方面的时间。
这几种工具的原理都差不多。

本篇文章着重写如何把大量零散的图片打包成图集,然后动态调用相对应的图集来生成sprite。
//这句话的意思是,这个.CS文件的物体的atlas图集的路径设置为

gameObject.GetComponent<UISprite>().atlas = Resources.Load("路径") as UIAtlas;

TexturePacker比NGUI打包的图集大小要小,如果不嫌弃麻烦可以考虑用TexturePacker代替NGUI打包图集



TexturePacker参考资料:

Unity 之 TexturePacker(TP) 的应用

Unity3D 使用Texturepacker打包工具制作NGUI(Atlas)图集

Unity3D-UGUI图集打包与动态使用(TexturePacker)

[Unity3D学习]TexturePacker与NGUI配合使用
















资料参考:



Unity NGUI中动态添加和删除sprite
动态创建Sprite

通过代码动态更改SpriteRender的Sprite

在NGUI 中动态创建的Sprite中 怎么添加图集


NGUI中动态添加和删除Sprite


用NGUI动态添加和删除Sprite

NGUI研究院之Sprite精灵与精灵动画的使用(二)

Unity之路 (十四)-解决Atlas图集混乱
【Unity3D】【NGUI】Atlas的动态创建

NGUI使用教程(3) 使用外部图片制作Atlas(图集)

Unity3D-UGUI图集打包与动态使用(TexturePacker)

Unity读取本地图片资源

 

C#程序员整理的Unity 3D笔记(二十):2D Toolkit之官方教程《Whack a Mole》


Unity3D-UGUI图集打包与动态使用(TexturePacker)

Unity读取本地图片资源

 

C#程序员整理的Unity 3D笔记(二十):2D Toolkit之官方教程《Whack a Mole》

2019-04-17 20:53:00 Game_Builder 阅读数 207
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4714 人正在学习 去看看 张刚

图片导入 设置等:
常用的格式png jpg

将图片textureType设置为Sprite

将单个图片设置为SpriteMode设置为Single

将包含多个小图的一张大图SpriteMode设置为Multiple,在SpriteEditor中将素材进行切割,得到小的图片资源

PackingTag进行精灵打包,减少资源大小,减少加载次数

GenerateMipMap(3D图片使用)牺牲CPU优化GPU,图片(大小)占用的内存增加33%左右,保存原图片的各种缩小图,在距离较远时,使用小图,来减少GPU的负担

Read/Write Enable是否需要改图片

精灵动画通过将多个精灵一起拖入Hierarchy进行创建精灵动画

SpriteRender:
OrderInLayer来控制渲染层级,数大的渲染在前面.

注意:在定项目之前定一个主分辨率

2D碰撞条件和3D碰撞一样
给地形添加EdgeCollider地形碰撞
给玩家添加Rigidbody2D ,FreezeRotation -Z

2018-09-21 20:16:15 Aarondwa 阅读数 631
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4714 人正在学习 去看看 张刚

创建一个新项目

打开unity,然后选择new,将Template的3D改为2D。
准备界面

项目资源

将资源导入到unity里。

游戏场景

这里写图片描述
(1)将素材拖进场景里,在右边的Sprite Renderer组件里的color可以随意改变颜色。
(2)给这个对象添加box collider2D组件,因为这个将当做地板。

背景颜色与游戏视野

2D游戏的背景颜色可以在Main camera对象里的background里更改
这里写图片描述
Projection要改为Orthographic(因为这是2D视野)
感觉主角过大的话可以把摄像头尺寸调大(让视野更宽广)将Size调大即可

玩家角色动画

将玩家角色的素材拖入场景 名字更改为Player


点击玩家角色 点开Game旁边的Animation
创建新的动画 名为idle
创建完以后点击Add Property → Sprite Renderer → Size(添加一个曲线)
将待机的素材放进曲线里
改Sample可以让动画切换的速度变慢
需要注意的是在第60秒可能会有原素材在里面 要删掉
这里写图片描述
其他动画同理
一共有待机,跑步,跳起,跳下,滑行等动画。

玩家角色


(1)给玩家添加Box Collider 2D组件 因为滑行的状态是靠着墙壁的
所以先把素材换成滑行的素材 然后依照滑行的素材更改碰撞体积
(2)添加刚体组件(Rigidbody2D)

实现角色移动

原理是通过施加力(AddForce)来让玩家移动
创建C#脚本 命名为Move

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class move : MonoBehaviour {
    public float force_move = 50;//移动的力 用力推动角色移动
    Rigidbody2D rgd;//引用刚体组件
    private void Awake()
    {
        rgd = GetComponent<Rigidbody2D>();//获得刚体组件
    }

  
    void Update () {
        float h = Input.GetAxis("Horizontal");//给h赋值 输入左右键
        Vector2 velocity = rgd.velocity;//将矢量的速度赋予给刚体
        if (h > 0.05f)//大于0.05的话就是按了右键
        {
            rgd.AddForce(Vector2.right * force_move);//给刚体施加力
        }
        else if (h < -0.05f)//小于0.05的话就是按了左键
        {
            rgd.AddForce(-Vector2.right * force_move);//给刚体施加力
        }
    }
}

将脚本拖进Player的对象里
然后启动游戏就会发现可以左右移动了

切换状态

点击Player的对象
点击Scene旁边的Animator 会发现里面有五个状态 即为idle,run,jumpup ,jumpdown ,slide (如果之前有正确创建的话)
这里写图片描述
我们首先要做的是将待机状态转化为奔跑:
右键idle状态 → Make Transition → 连接到run状态 →再右键run状态
→ MakeTransition →连接到idle状态
这样状态就可以互相切换了

但是要创建一个值让它们判断/自动切换
点击Layer旁边的Parameters → 创建(“+”符号) → Float值 → 命名为horizontal
用Float值是为了判定是否大于小于速度就切换状态 用绝对值更改值
在Move脚本里(Update) 添加新的代码

  anim.SetFloat("horizontal", Mathf.Abs(h));
  //Mathf是绝对值,设置它的状态转换

将新设置的值(horizontal)
放到刚刚创建的两条Transition里
这里写图片描述
(1)将idle到run的线的horizontal值设置为Greater(大于)0.1的速度
(2)将run到idle的线的horizontal值设置为Less(小于)0.1的速度
注意:将Has Exit Time勾去掉,不然动画结束会有延迟

然后启动游戏就会发现左右移动时会有奔跑的动作。

更改朝向

虽然左右移动有了奔跑的动作,但是会发现角色的朝向不会变
所以我们要添加代码更改它的朝向
代码添加在move脚本里的Update
原理:检测按下的是左还是右键 然后用用transform.localScale更改朝向

			 if (h > 0.05f)大于0.05就是按了右键
            {
                transform.localScale = new Vector3(1, 1, 1);//朝向右方向
            }
            else if (h < -0.05f)小于0.05就是按了左键
            {
                transform.localScale = new Vector3(-1, 1, 1);//朝向左方向  
            }

添加完后保存脚本再启动游戏就会发现按下左右键会更改朝向了

2019-11-11 10:59:11 qq_43292530 阅读数 124
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4714 人正在学习 去看看 张刚

本文推荐一些用于开发GalGame或者视觉小说(Visual Novel)游戏的3D模型、动作动画、2D素材、音频素材和相关Unity插件。

一:3D模型

Riko

Riko这套模型是是由日本开发商SURIYUN制作的,模型带有非常明显的日式少女风格。SURIYUN制作了几十套类似的少女模型,每套模型都有非常完整的正常动画体系,内置多套服装,而且模型面目表情的喜怒哀乐也都非常到位。

点击查看更多SURIYUN制作的少女模型,下面放几张该开发商制作的其他模型图片。

 

二:动作动画


1:AnyPortrait

AnyPortrait是帮助开发者创建二维角色动画的绝佳工具,开发者可以轻松创建2D网络并使用各种动画技术。

2:Woman Dance 1

Woman Dance 1包含18段女性的舞蹈动作,该动画由PolygonCraft开发。PolygonCraft是一家来自韩国的专业动作开发商,开发了许多舞蹈动作。

点击查看更多来自PolygonCraft的舞蹈动画

三:2D素材

1:2D Novel Game Starter Pack Vol.1.0

该素材是由来自日本的开发商WillPlus开发制作。该套素材包含一个完整小说游戏所需要的角色和背景素材,角色带有表情变化,同时内置了几首BGM背景音乐。

 

点击查看更多来自WillPlus的类似素材

2:Duff

Duff开发了十几套带有动画的2D素材模型。

3:2D Personages Pack

该素材包含8个2D人物全身像。适合作为欧美风格2D游戏的人物素材。

4:High quality character series 'Weapongirls''

包含一组高清角色素材,角色包含若干面部表情。

四:音频资源

Cute Romantic Music Pack

该组音频资源非常适合GalGame的氛围。资源包含7组不同的音乐,每种音乐又使用2~4种不同的方式演奏,能够演奏出多种心情的变化:开心、轻松、浪漫、淘气与惊喜,还包括十几种特有的音效。该资源包由韩国的音频开发商W.O.W Sound开发。

点击查看更多来自W.O.W Sound的资源

 

五:相关Unity插件

1:Love/Hate

Love/Hate是一套人物情感模拟插件。它通过一系列情感状态和数值来追踪游戏中角色之间的情感变化。

2:Naninovel — Visual Novel Engine

Naninovel是制作视觉小说非常流行的Unity插件,非常适合制作具有大量文本且有交互性的游戏。开发者可以编写自己的Naninovel脚本,该插件包含非常完善的视频教程,而且还一直在完善中。目前七折优惠。

3:Visual Novel Engine/2D Cutscene Engine

Visual Novel Engine是一款制作视觉小说的轻量级Unity插件,各种参数均可以在Hierarchy窗口写入,非常容易上手。

4:UTAGE3 Unity Text Adventure Game Engine Version3

Unity开发者可以使用Utage轻松制作各种视觉小说游戏,开发者只需将剧本参数写入Excel表格,插件对编程能力要求不高。

5:Discourse

Discourse是一款基于状态机的可视化事件管理插件。开发者可以通过编辑状态机来管理各种对话、事件等。适合新老Unity开发者,易于上手。

6:ChoiceEngine: Visual Novel and Text Game Engine

ChoiceEngine适合制作各种基于文字的游戏,是一款可视化的开发工具。基于节点的开发框架可以轻松制作各种对话,每个节点均可定制素材、角色、背景图像、音乐、音效和各种可反馈操作。

更多插件资源可以到游戏开发插件之家查看。

如果没有在Asset Store上找到合适的资源,可以参考下面的文章定制Unity素材资源。

在Fiverr寻找精品艺术家定制Unity游戏素材资源

RogueDome01

阅读数 70

Unity坦克实战

阅读数 436

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