unity3d-游戏实战突出重围,第四天 添加角色
1:添加unity自带的第一人称角色控制器,命名为hreo
2:添加第三人称角色控制器。这里是添加源文件Sources下面的。如箭头指示:而不是“3rd Person Controller”。并命名为NPC。并设置预设,和加上BOX碰撞器。产生多个NPC。结构图:

3:修改hreo自带的Mouse Look脚本
using UnityEngine;
using System.Collections; /// MouseLook rotates the transform based on the mouse delta.
/// Minimum and Maximum values can be used to constrain the possible rotation /// To make an FPS style character:
/// - Create a capsule.
/// - Add the MouseLook script to the capsule.
/// -> Set the mouse look to use LookX. (You want to only turn character but not tilt it)
/// - Add FPSInputController script to the capsule
/// -> A CharacterMotor and a CharacterController component will be automatically added. /// - Create a camera. Make the camera a child of the capsule. Reset it's transform.
/// - Add a MouseLook script to the camera.
/// -> Set the mouse look to use LookY. (You want the camera to tilt up and down like a head. The character already turns.)
[AddComponentMenu("Camera-Control/Mouse Look")]
public class MouseLook : MonoBehaviour { public enum RotationAxes { MouseXAndY = , MouseX = , MouseY = }
public RotationAxes axes = RotationAxes.MouseXAndY;
public float sensitivityX = 15F;
public float sensitivityY = 15F; public float minimumX = -360F;
public float maximumX = 360F; public float minimumY = -60F;
public float maximumY = 60F; float rotationY = 0F; //鼠标准心
public Texture2D tex_fire; void Update ()
{
if (axes == RotationAxes.MouseXAndY)
{
//float rotationX = transform.localEulerAngles.y + Input.GetAxis("Mouse X") * sensitivityX; //rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
//rotationY = Mathf.Clamp (rotationY, minimumY, maximumY); //transform.localEulerAngles = new Vector3(-rotationY, rotationX, 0);
}
else if (axes == RotationAxes.MouseX)
{
transform.Rotate(, Input.GetAxis("Mouse X") , );
}
else
{
//rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
//rotationY = Mathf.Clamp (rotationY, minimumY, maximumY); transform.localEulerAngles = new Vector3(-rotationY, transform.localEulerAngles.y, );
}
} void OnGUI()
{
if (tex_fire)
{
//绘制鼠标准心
float x = Input.mousePosition.x - tex_fire.width / ;
float y = Screen.height - Input.mousePosition.y - tex_fire.height / ; GUI.DrawTexture(new Rect(x, y, tex_fire.width, tex_fire.height), tex_fire);
}
} void Start ()
{
// Make the rigid body not change rotation
if (GetComponent<Rigidbody>())
GetComponent<Rigidbody>().freezeRotation = true; //取消鼠标默认状态
Screen.showCursor = false;
}
}
5 :编写脚本命名为dr.cs绑定到NPC上
using UnityEngine;
using System.Collections; public class dr : MonoBehaviour
{ //是否绘制敌人血条
bool showBlood = false;
//血条资源贴图
public Texture2D tex_red;
public Texture2D tex_black;
//生命值
private int HP = ;
//主角对象
private GameObject hero;
// Use this for initialization
void Start()
{
hero = GameObject.Find("Hero");
} // Update is called once per frame
void Update()
{
//设置始终朝向
transform.LookAt(hero.transform);
} void OnGUI()
{
if (showBlood)
{
//绘制敌人血条
int blood_widht = tex_red.width * HP / ;
GUI.DrawTexture(new Rect(, , tex_black.width, tex_black.height), tex_black);
GUI.DrawTexture(new Rect(, , blood_widht, tex_red.height), tex_red);
}
} /// <summary>
/// 当鼠标在GUIElement(GUI元素)或Collider(碰撞体)上点击时调用OnMouseDown。
/// </summary>
void OnMouseDown()
{
//敌人击中目标
if (HP > )
{
//减血
HP -= ;
//击打回馈
}
}
/// <summary>
/// 当用户释放鼠标按钮时调用OnMouseUp。
/// </summary>
void OnMouseUp()
{
//击打敌人后移动一段距离
transform.Translate(Vector3.back * 0.1f);
}
/// <summary>
/// 当鼠标悬浮在GUIElement(GUI元素)或Collider(碰撞体)上时调用 OnMouseOver 。
/// </summary>
void OnMouseOver()
{
//当对着敌人时,开始绘制血条,即显示敌人当前的血条
showBlood = true; }
/// <summary>
/// 当Collider(碰撞体)停止触发trigger(触发器)时调用OnTriggerExit。
/// </summary>
void OnMouseExit()
{
//结束绘制血条
showBlood = false;
}
}
7:dr.cs脚本实现了。当鼠标指向敌人时,显示敌人当前的血条情况,
当击中敌人时候。敌人会后退几步。
dr.cs脚本升级:敌人AI即人工智能
实现功能:让NPC有自己的生命周期:就是自己巡逻。当在巡逻范围内看到hero,即跑向hero开始攻击(这里暂为实现)
using UnityEngine;
using System.Collections; public class drAI : MonoBehaviour
{ //敌人状态 //敌人站立状态
public const int STATE_STAND = ;
//敌人行走状态
public const int STATE_WALK = ;
//敌人奔跑状态
public const int STATE_RUN = ;
//记录敌人的当前状态
private int enemyState;
//主角对象
private GameObject hero;
//备份上一次的敌人思考时间
private float backUptime;
//敌人思考下一次行为的时间
public const int AI_THINK_TIME = ;
//敌人的巡逻范围
public const int AI_ATTACK_DISTANCE = ; // Use this for initialization
void Start()
{
//得到主角对象
hero = GameObject.Find("/Hero");
//设置敌人的默认状态为站立
enemyState = STATE_WALK;
} // Update is called once per frame
void Update()
{
//判断敌人与主角的距离 当在巡逻范围内
if (Vector3.Distance(transform.position, hero.transform.position) < AI_ATTACK_DISTANCE)
{
//敌人进入奔跑状态
gameObject.animation.Play("run");
enemyState = STATE_RUN;
//设置敌人面朝主角方向
transform.LookAt(hero.transform);
}
//敌人进入巡逻状态
else
{
//计算敌人的思考时间
if (Time.time - backUptime >= AI_THINK_TIME)
{
//敌人开始思考
backUptime = Time.time;
//取得0~2之间的随机数
int rand = Random.Range(, );
if (rand == )
{
//敌人进入站立状态
gameObject.animation.Play("idle");
enemyState = STATE_STAND;
}
else if (rand == )
{
//敌人进入行走状态
//敌人随机旋转角度
Quaternion rotate = Quaternion.Euler(, Random.Range(, ) * , );
//1秒内完成敌人旋转
transform.rotation = Quaternion.Slerp(transform.rotation, rotate, Time.deltaTime * );
//播放行走动画
gameObject.animation.Play("walk");
enemyState = STATE_WALK;
}
}
}
switch (enemyState)
{
case STATE_STAND: break;
case STATE_WALK:
//敌人行走
transform.Translate(Vector3.forward * Time.deltaTime);
break;
case STATE_RUN:
//敌人朝向主角奔跑
if (Vector3.Distance(transform.position, hero.transform.position) > )
{
transform.Translate(Vector3.forward * Time.deltaTime * );
}
break;
default:
break;
}
}
}
知识点:
Quaternion四元素表示旋转。Quaternion.Euler()方法返回一个旋转的四元素。该方法参数表示旋转的三维角度。执行该方法后,将
四元素赋值给一个对象的旋转变量
transform.rotation = rotate 即可在一帧内完成旋转,若想在一段时间内完成旋转,就需要用到
Quaternion.Slerp()方法:
第一个参数表示模型旋转的起始角度
第二参数表示模型的结束角度
第三个参数表示旋转消耗的时间
unity3d-游戏实战突出重围,第四天 添加角色的更多相关文章
- Unity3D游戏开发和网络游戏实战书籍及配套资源和一些视频教程分享
目录 1. 按 2. pdf 3. 配套资源 3.1. Unity网络游戏实战第二版 3.2. Unity网络游戏实战第一版 4. 视频教程 5. 更多坦克大战代码 1. 按 本文主要分享了: Uni ...
- Unity3D游戏开发从零单排(四) - 制作一个iOS游戏
提要 此篇是一个国外教程的翻译,尽管有点老,可是适合新手入门. 自己去写代码.debug,布置场景,能够收获到非常多.游戏邦上已经有前面两部分的译文,这里翻译的是游戏的最后一个部分. 欢迎回来 在第一 ...
- Unity3D项目实战笔记(5):延时功能的几种实现
我所做过的系统,分单机版系统(2005年).CS系统(2010年).实时系统(2015年),各个系统均有“延时”功能:定时调度的: 本博客说的是实时系统中的延时功能(基于Unity3D游戏引擎). 在 ...
- [Unity3D]Unity3D游戏开发之飞机大战项目解说
大家好,我是秦元培,欢迎大家继续关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei. 首先感谢大家对我博客的关注,今天我想和大家分享的是一个飞机大战的项目.这是一个比較综合的 ...
- [Unity3D]Unity3D游戏开发Lua随着游戏的债券(于)
---------------------------------------------------------------------------------------------------- ...
- [整理]Unity3D游戏开发之Lua
原文1:[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(上) 各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我地博客地址是blog.csdn.net/qinyuanpei.如果 ...
- [转载]Unity3D游戏引擎最详尽基础教程
原文地址:Unity3D游戏引擎最详尽基础教程作者:ShangShang 我一直向所有想做游戏的朋友推荐Unity3D,为什么呢?首先是因为专业,Unity3D非常强大,用它创建一个类似MiniGor ...
- Unity3D游戏开发之SQLite让数据库开发更简单
各位朋友大家好.欢迎大家关注我的博客,我是秦元培,我是博客地址是http://blog.csdn.net/qinyuanpei.在经历了一段时间的忙碌后,博主最终有时间来研究新的东西啦,今天博客向和大 ...
- Unity3D游戏轻量级xlua热修复框架
Unity3D游戏轻量级xlua热修复框架 一 这是什么东西 前阵子刚刚集成xlua到项目,目的只有一个:对线上游戏C#逻辑有Bug的地方执行修复,通过考察xlua和tolua,最终选择了xlua ...
随机推荐
- hive中的几个参数:元数据配置、仓库位置、打印表字段相关参数
hive仓库位置由以下参数决定,默认位置/user/hive/warehouse: <property> <name>hive.metastore.wareho ...
- C和C指针小记(六)-基本声明、指针声明、typedef 、常量、作用域、链接属性、存储类型、static
1.变量的声明 声明变量的基本形式: 说明符号(一个或者多个) 声明表达式列表 说明符 (specifier) 包含一些关键字,用于描述被声明的标识符的基本类型,它也可用户改变标识符的缺省存储类型和作 ...
- dp单调性优化
跟着书上的思路学习dp的单调性优化觉得还是很容易想的. 数据范围: dp,数据范围是百万,这应该是O(n)的算法了. 首先不难想到设f[i]表示到第i个百米所能达到的最大能量,那么f[n]即为所求. ...
- 转:深入理解css中position属性及z-index属性
原文链接:https://www.cnblogs.com/zhuzhenwei918/p/6112034.html static定位是HTML元素的默认值,即没有定位,元素出现在正常的流中,因此,这种 ...
- eclipse中tomcat无法加载spring boot
转自: http://blog.csdn.net/u010797575/article/details/50517777 最近搭建一套spring boot框架,作为 application 启动项目 ...
- webpack4入门配置
下面是抄过来的,方便自己翻越 webpack4.x入门配置 1.首先npm install webpack webpack-cli webpack-dev-server -g (mac电脑用超级管 ...
- SpringBoot-整合log4j日志记录
新建log4j配置文件 文件名称log4j.properties #log4j.rootLogger=CONSOLE,info,error,DEBUG log4j.rootLogger=info,er ...
- django基础-01:软件框架,MVC框架,MVT
1. 软件框架 一个公司是由公司中的各部部门来组成的,每一个部门拥有特定的职能,部门与部门之间通过相互的配合来完成让公司运转起来. 一个软件框架是由其中各个软件模块组成的,每一个模块都有特定的功能,模 ...
- 如何将finecms链接URL中的list和show去掉
finecms上手还算比较快吧,对seo关注的朋友会想着将它的url改造了,里面多了-list-和-show-,可以直接去掉,下面就随着ytkah一起来进行设置吧. 首先到后台的url规则,将列表和列 ...
- 计算机网络 0.初识Internet与TCP/IP协议
互联网,即因特网,Internet.互联网是一个世界范围的计算机网络.连接了世界上无数的计算设备,这些计算设备为PC.基于Linux的工作站,serverservers等等. 这些设备依据其作用不同可 ...