2019-07-20 18:30:15 moon_goes 阅读数 86

Unity3D RPG游戏Demo开发日记(一)

一、场景布置

在这里插入图片描述简单的场景布置:
1.创建terrain后将地形高度设置为100。
2.用笔刷将地面贴图铺满terrain。
3.在terrain上布置房子、树木、花草、山坡等环境。
场景布置中常用到快捷键:QWE等调整物体位置、大小。

二、Player设置
1.导入作为Player的资源。

2.为角色添加控制行走功能,使用c#脚本:

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

public class Move : MonoBehaviour {

public float m_speed = 1f;

// Use this for initialization
void Start () {
	
}

// Update is called once per frame
void Update () {
    if (Input.GetKey(KeyCode.W))
    {
        this.transform.Translate(Vector3.forward * m_speed * Time.deltaTime);
    }
    if (Input.GetKey(KeyCode.S))
    {
        this.transform.Translate(Vector3.back * m_speed * Time.deltaTime);
    }
    if (Input.GetKey(KeyCode.A))
    {
        this.transform.Translate(Vector3.left * m_speed * Time.deltaTime);
    }
    if (Input.GetKey(KeyCode.D))
    {
        this.transform.Translate(Vector3.right * m_speed * Time.deltaTime);
    }
}

}

3.控制摄像机的跟随,第三人称模式先预定好摄像机位于人物的后上方。
在这里插入图片描述
挂载跟随脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraFollow : MonoBehaviour {

// Use this for initialization
public GameObject player;

void Start () {
    
}

// Update is called once per frame
void Update () {
    this.transform.position = player.GetComponent<Transform>().position + transform.up * 5 - transform.forward * 40;//使相机保持固定位置
    
}

}

关于charactercontroller遇到的坑:
使用character controller处理运动的人物在判断碰撞时,不能使用collision来判定,需要使用OnControllerColliderHit。但是如果反过来用rigidbody运动的物体碰撞character controller时,可以使用collision。
//所用资源均来源与assets store免费资源

欢迎使用Markdown编辑器

你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

新的改变

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计 ,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
  3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法1 功能;
  6. 增加了 多屏幕编辑 Markdown文章功能;
  7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  8. 增加了 检查列表 功能。

功能快捷键

撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G

合理的创建标题,有助于目录的生成

直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

插入链接与图片

链接: link.

图片: Alt

带尺寸的图片: Alt

居中的图片: Alt

居中并且带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
var foo = 'bar';

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目 Value
电脑 $1600
手机 $12
导管 $1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列 第二列 第三列
第一列文本居中 第二列文本居右 第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPE ASCII HTML
Single backticks 'Isn't this fun?' ‘Isn’t this fun?’
Quotes "Isn't this fun?" “Isn’t this fun?”
Dashes -- is en-dash, --- is em-dash – is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to-HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。2

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ(n)=(n1)!nN\Gamma(n) = (n-1)!\quad\forall n\in\mathbb N 是通过欧拉积分

Γ(z)=0tz1etdt&ThinSpace;. \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

Mon 06Mon 13Mon 20已完成 进行中 计划一 计划二 现有任务Adding GANTT diagram functionality to mermaid
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::

张三李四王五你好!李四, 最近怎么样?你最近怎么样,王五?我很好,谢谢!我很好,谢谢!李四想了很长时间,文字太长了不适合放在一行.打量着王五...很好... 王五, 你怎么样?张三李四王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

Created with Raphaël 2.2.0开始我的操作确认?结束yesno
  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. mermaid语法说明 ↩︎

  2. 注脚的解释 ↩︎

2015-01-05 21:18:41 caoboya 阅读数 1385

欢迎来到unity学习unity培训unity企业培训教育专区,这里有很多U3D资源U3D培训视频U3D教程U3D常见问题U3D项目源码,我们致力于打造业内unity3d培训、学习第一品牌。

一、动态障碍物。  

       之前我们都是用固定的物体作为障碍物,然后烘焙场景。Unity还提供了动态的障碍物。任何一个GameObject都可以添加Navmesh Obstacle组件,变成一个障碍物。具体步骤是Component->Navigation->Navmesh Obstacle.它有两个属性:半径和高度,可以设置跟你的物品差不多的体积大小。

二、高空跳下。

       1、设置Navigation里面Bake的Drop Height的值

       2、勾选Navigation里面Object的OffMeshLink Generatic

       3、Bake


、选择性行走。

       1、把Navigation里面Bake的Drop Height的值设为0

       2、取消勾选Navigation里面Object的OffMeshLink Generatic

       3、Bake

       4、在Navigation里面Layers创建两个Layers(LayersUp  LayersDown)-->Bake


       5、选中巨魔,设置巨魔属性(NavMesh Walkable :Default  LayersUp或LayersDown)

2013-04-19 17:10:45 iteye_20251 阅读数 222

一、创建Unity项目

       打开Unity游戏编辑器界面,在导航菜单栏中选择File --->  New Project菜单项,在弹出界面中选择Create new Project页面,将项目名命名为MobilityModel,然后再点击Create Project,完成项目的创建。

       然后点击保存(Ctrl+S)保存场景。

 

二、构建模型

       在Hierarchy视图中分别创建游戏对象Plane(面板)、Cube(立方体)、Sphere(球体)、Cylinder(圆柱体)、Capsule(胶囊体),然后鼠标拖动创建的游戏对象将他们摆放在合适的位置。

       接下来在游戏中添加一个光源,在Hierarchy视图中选择Create--->Directional light菜单项,光源是游戏中非常重要的一个属性,一定要在游戏场景中设置它,如果不设置光源对象,Game视图会非常暗,严重影响游戏的效果。

 

三、添加脚本

       在Project视图中点击Create--->JavaScript菜单项创建一个游戏脚本,将其命名为MobilityModelScript.js,在脚本上编写如下代码:

//模型移动速度
var TranslateSpeed = 10;
//模型旋转速度
var RotateSpeed = 1000;
//绘制UI界面
function OnGUI(){
	//设置GUI背景色
    GUI.backgroundColor = Color.red;
	if(GUI.Button(Rect(10,10,70,30),"向左旋转")){
		//向左旋转
		transform.Rotate(Vector3.up * Time.deltaTime * (-RotateSpeed));
	}
	if(GUI.Button(Rect(90,10,70,30),"向前移动")){
		//向前移动
		transform.Translate(Vector3.forward * Time.deltaTime * TranslateSpeed);
	}
	if(GUI.Button(Rect(170,10,70,30),"向右旋转")){
		//向右旋转
		transform.Rotate(Vector3.up * Time.deltaTime * RotateSpeed);
	}
	if(GUI.Button(Rect(90,50,70,30),"向后移动")){
		//向后移动
		transform.Translate(Vector3.forward * Time.deltaTime * (-TranslateSpeed));
	}
	if(GUI.Button(Rect(10,50,70,30),"向左移动")){
		//向左移动
		transform.Translate(Vector3.right * Time.deltaTime * (-TranslateSpeed));
	}
	if(GUI.Button(Rect(10,50,70,30),"向右移动")){
		//向右移动
		transform.Translate(Vector3.right * Time.deltaTime * TranslateSpeed);
	}
	
	//显示模型位置信息
	GUI.Label(Rect(250,10,200,30),"模型位置"+transform.position);
	//显示模型旋转信息
	GUI.Label(Rect(250,50,200,30),"模型旋转"+transform.rotation);
}

      上述代码中重要方法和属性如下:

      OnGUI()方法用来绘制GUI界面组件。

      GUI.Button():设置一个按钮,返回true时表示该按钮被按下。

      GUI.Label():设置一个文本框。

      transform:为当前绑定模型的变换对象。

      transform.Rotate():设置模型旋转。

      transform.Translate():设置模型平移。

      Time.deltaTime:该数值为一个只读属性,不可修改,表示完成最后一帧的事件,单位为秒。

      Vector3:标志一个模型移动或者旋转的方法。

      Rect:规定一个矩形区域,用于显示控件。

      将编写好的脚本对象,将其从Project视图拖拽到Hierarchy视图中的立方体(Cube)对象上,如果没有提示错误,表示脚本绑定成功,运行游戏后该游戏对象将执行该脚本中的内容。

 

       目前立方体对象与其他模型对象之间是不存在碰撞的,但是运行游戏后,可以控制立方体(Cube)直接穿越另一个模型对象。为了让模型对象之间具有物理的碰撞,需要给模型对象添加一个刚体(Rigidbody)属性,添加方式:首先在Hierarchy视图中选中立方体对象,在Uinty导航菜单栏中选择Component --> Physics 

-->Rigidbody菜单项即可。

 

四、测试运行

       点击运行按钮就能看到结果,可以点击显示的六个按钮对象,可以移动Cube(立方体)的位置和旋转。


 

2013-08-22 22:48:24 yy8245075 阅读数 3215

        经过前三章的介绍,我们终于搞定了游戏界面,从本章开始,我将带大家创造游戏世界!作为一个游戏爱好者,最熟悉的莫过于WASD键,它控制着人物行走,带我们认识游戏世界,那么在Unity3D中我们如何控制人物行走移动呢?

        本章目标:使用Transform控制物体行走。W、S控制物体向前向后行走,A、D控制物体转视角,

        本章要点:

                        1、Transform类

                        2、Input类 

一、Transform类

        Transform类包含了所有物体的位置、旋转和缩放信息   ,作为GameObject(Unity场景里面所有实体的基类)的属性之一,同时控制着物体的位移,旋转和缩放

        常用的属性包括

                position物体在世界坐标轴下的位置

                right、up、forword物体自身坐标轴下的X轴Y轴Z轴

                rotation物体自身的旋转角度

         常用的方法有

                  1、Translate控制物体的平移

void Update() {
		transform.Translate(Vector3.forward * Time.deltaTime);
		transform.Translate(Vector3.up * Time.deltaTime, Space.World);
	}

                      小写的transform是因为它作为GameObject的属性之一存在,Vector3.forword即向量(0,0,1)的简写,Space.Word指世界坐标轴,乘上Time.deltaTime可以

                      理解为每秒运动的距离

                  2、Rotae控制物体的旋转

void Update() {
		transform.Rotate(Vector3.right * Time.deltaTime);
		transform.Rotate(Vector3.up * Time.deltaTime, Space.World);
	}

                  注意,这里我只列举了最简单的方法,Translate和Rotae方法还有许多重载的方法,大家想了解的话可以去查文档或者留言问我

二、Input类

        使用这个类能够读取输入管理器设置的按键,以及访问移动设备的多点触控或加速感应数据。 在这里我只介绍本节所需的几个重要函数

         1、GetKeyDownGetKeyGetKeyUp分别在按键按下,按住和抬起时触发

void Update()
        {
            if (Input.GetKeyDown(KeyCode.A))
                print("A key was pressed");

            if (Input.GetKey(KeyCode.A))
                print("A is held down");
            if (Input.GetKeyUp(KeyCode.A))
                print("A key was released");
        }

 

         2、GetAxis如果你使用Input制作某种运动行为可以使用Input.GetAxis方法,它能够控制物体运动的方向。"Horizontal" 和"Vertical" 映射于控制杆、A、W、S、D和箭头键

             (方向键)。 "Mouse X" 和"Mouse Y" 映射于鼠标,"Fire1", "Fire2" "Fire3"映射于键盘的Ctrl、Alt、Cmd键和鼠标中键或控制器的按钮。新的输入设置可以使用输入管理 

               器来添加。

              注意:每次输入在"Update()"之前不会再更新,所以建议你将所有的输入调用都写在Update方法中。


介绍完本节的知识点,下面我们就来完成本章的目标:使用Transform控制物体行走。W、S控制物体向前向后行走,A、D控制物体转视角

一、创建地形,在地形上新建一个Cube

导入Scripts包,选中主摄像机,在Component菜单下选择Camera-Control——>Smooth Follow,将Cube拖到target上,如下图所示

二、新建脚本,绑定到Cube上

public class InputCtrol : MonoBehaviour {
    public int speed = 2;
	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
        if (Input.GetKey(KeyCode.W))
        {
            //transform.Translate(transform.forward* speed * Time.deltaTime,Space.World);
            transform.Translate(Vector3.forward * speed * Time.deltaTime);
        }
        if (Input.GetKey(KeyCode.S))
        {
            //transform.Translate(-Vector3.forward * speed * Time.deltaTime, Space.World);
            transform.Translate(-Vector3.forward * speed * Time.deltaTime);
        }
        if (Input.GetKey(KeyCode.A))
        {
            transform.Rotate(-Vector3.up);
        }
        if (Input.GetKey(KeyCode.D))
        {
            transform.Rotate(Vector3.up);
        }
	}
}


或者一种更简单的方法

using UnityEngine;
using System.Collections;

public class CubeControl : MonoBehaviour {
    public int speed=10;
	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {

        transform.Translate(new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"))*speed*Time.deltaTime);
	}
}


 

完整项目,包含三个点之间移动的脚本,希望对大家有帮助.http://download.csdn.net/detail/yy8245075/5995803

2019-07-21 17:41:32 moon_goes 阅读数 68

今天学习了Animator组件对动画播放的控制。

1.在需要控制的物体下创建一个Animator组件,再创建一个Animator Controller拖到Controller下。
在这里插入图片描述
2.进入Controller对要播放的动画顺序进行编辑,在此暂时只有三个动作动画的切换,分别是站立、行走和跑。创建一个参数speed用来界定动画播放。物体默认站立状态,当物体运动速度大于0,切换为行走,大于1,从行走切换为跑。
在这里插入图片描述

player_speed = this.GetComponent<CharacterController>().velocity.magnitude;//获取人物运动速度
    anima.SetFloat("speed", player_speed);

SetFloat方法接收两个参数,一个是animator中的参数名,另外一个是你要传递给它的参数。我的理解是方法把传递的参数作为它的实参套用到前者的约束中。
获取物体移动速度可以从CharacterController组件中获取,通过velocity,注意要用magnitude获取数值大小。
可以添加的参数有四种类型,可以按需选择不同类型
可以添加的参数有四种类型,可以按需求选择。

7/22
做控制人物攻击动画的时候先是使用了Bool类型的参数,true播放攻击动画,false返回原状态。

  if (Input.GetKey(KeyCode.Q))//按下Q键触发动画播放
        {
            attack();
        }

    void attack()//攻击动画
    {
        anima.SetBool("attack", true);
    }

animator中转换条件是attack为true转为攻击状态。
在这里插入图片描述
但是此处出现了一个bug(目前未解决),就是attack动画会反复播放,并不会返回原先的状态。改错思路尝试过计算attack动画长度,采用一个float类型的变量存储动画时长,timer-=Time.deltaTime timer<=0则设置attack为false,并没有如期运行。

随后学习了trigger变量,trigger变量在按下按键时变更为true,然后动画播放完自动返回false状态,于是攻击动画采用了trigger实现。

if (Input.GetKey(KeyCode.Q))
        {
            attack();
        }
    void attack()//攻击方法
    {
        anima.SetTrigger("attack");//SetTrigger只接受参数名,不用设置true or false
    }

7/23
控制攻击动画播放还存在两个问题,一是动画会播放了一小段又从头开始播放,这个问题通过修改GetKey为GetKeyDonw后得到解决,但这引发第二问题,触发的动画循环播放,不返回原状态。是因为没有取消动画的Loop Time。
在这里插入图片描述
在动画设置界面将Loop Time取消即可解决。

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