先上一个gif看看效果。因为图片大小限制。所以录制的比较小。个人认为效果比较牵强。特别是里面的逻辑代码。 不过我还是认为一切是为了先实现,因为我是刚接触的新手。

工程结构图

这次实现的效果是:

1:摄像机跟着角色移动,上篇博客说的是。把摄像机变成角色的子对象。发现没有我想要的效果。跟着角色移动代码是我自己弄出来的。不知道实际项目中是否也是这样。

2:利用角色控制器组建 CharacterController 实现角色移动。

3:当鼠左键击地形,角色自动寻路。今天发现用unity3d有自带的NavMesh实现自带寻路,不过还没去研究。

4:当鼠左键点击地形。实现一个高亮效果。

5:鼠标右键单击播放杀怪动画。

6:到达关卡场景,进入下一关。本来是想杀boss后在进入,但血条不会弄。

..............

Hierarchy视图中元素。分别是:主摄像机,平行光,地形,墙(也就是我这里的关卡),无效的元素,当前角色,鼠标点击显示图片,boss

加载场景的时候。需要把加载的场景Build进去

最后看看实现代码 ,有点牵强。也写了很多注释。方便大家和自己以后查看。

 using UnityEngine;
using System.Collections; public class chartMove : MonoBehaviour
{ public float speed = 5f;
public GameObject cursor;//鼠标点击光标显示图片
public GameObject boos; //boos对象 private Vector3 targetPos; //目标位置
private Vector3 mousePos; //鼠标单击的位置
private Vector3 beforePos;//角色移动前的位置
private CharacterController charController = null;
private bool cursorState = false; //当前是否点击了鼠标
private bool BossIsDie;//bos是否over // Use this for initialization
void Start()
{
charController = GetComponent<CharacterController>();
targetPos = transform.position;
mousePos = transform.position;
} // Update is called once per frame
void Update()
{
beforePos = transform.position; //保存当前的位置 //获取按键轴
/*
* Horizontal-->对应键盘上上的A,D
* Vertical-->对应键盘上上的W,S
* 当没有按键的时候为0 。
* 其值分别为 -1(左,下) 0 1(上。右)
*/
float x = Input.GetAxis("Horizontal");
float y = Input.GetAxis("Vertical"); //transform.Translate(new Vector3(x, 0, y) * Time.deltaTime * speed,Space.World); //if (x == 0 && y == 0 && !cursorState)
//{
// transform.animation.Play("idle");
//}
if (x != || y != )
{
transform.animation.Play("run"); //奔跑
cursor.SetActive(false);
//charController.Move(new Vector3(x, 0, y) * Time.deltaTime * speed);
//transform.Translate(new Vector3(x, 0, y) * Time.deltaTime * speed, Space.World);
cursorState = false;
charController.SimpleMove(new Vector3(x, , y) * speed); //设置角色面朝的方向
Vector3 lookPos = transform.position - beforePos + transform.position;
transform.LookAt(lookPos);
}
else
{ } //左键选择路径
if (Input.GetMouseButtonDown())
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, )) //100为射线的长度,限制用户瞎点击。在100以为点击无效
{
if (hit.collider.name == "Terrain")
{
mousePos = hit.point;
Vector3 lookPos = mousePos - transform.position + transform.position;
transform.LookAt(lookPos);
cursor.SetActive(true); //显示图片:图片一开始是隐藏的。
cursor.transform.position = mousePos;
cursorState = true;
}
}
} //判断角色是否到达目的地
int distance = (int)Vector3.Distance(mousePos, transform.position); //这个1.08的临界值。我是根据调试得来的。具体为什么是1.08,暂时还不知道
if (distance > 1.08f && cursorState)
{
transform.animation.Play("run"); //奔跑 //控制向量长度在 speed 范围在内
Vector3 setp = Vector3.ClampMagnitude(mousePos - transform.position, speed);
//charController.Move(setp*0.3f); //开始我用这个方法。不是我想要的效果
/*
这里要区别于:Move() 一个更加复杂的运动函数,每次都绝对运动
* SimpleMove:以一定的速度移动角色
*/
//cursorState = false;
charController.SimpleMove(setp); }
else
{
if (x == && y == )
{
//transform.animation.Play("idle");
cursor.SetActive(false);
//cursorState = false;
if (!transform.animation.IsPlaying("attack"))//当前没有攻击
transform.animation.Play("idle");
}
//transform.animation.Play("idle");
}
//右键攻击
/*
GetMouseButton:按下不弹起就一直执行
* GetMouseButtonDown:按下执行一次。
*
*/
if (Input.GetMouseButton())
{
cursorState = true;
transform.animation.Play("attack");//攻击
}
//transform.animation.Play("run"); //奔跑
//设置角色面朝的方向
//Vector3 lookPos = transform.position - beforePos + transform.position;
//transform.LookAt(lookPos); //设置相机跟随
Vector3 camera = Camera.main.transform.position; //获取主相机的位置
Vector3 currChart = transform.position;//当前角色位置 camera.x = currChart.x;
camera.y = currChart.y + ;
camera.z = currChart.z - ; Camera.main.transform.position = camera; //if ((charController.collisionFlags & CollisionFlags.Above) != 0)
// print("touched the ceiling"); }
/// <summary>
/// 当控制器碰撞一个正在运动的碰撞器时,OnControllerColliderHit 被调用。
/// </summary>
/// <param name="hit"></param>
public void OnControllerColliderHit(ControllerColliderHit hit)
{ //如果碰到的是墙并且boos is die,进入下一关,这里 墙 代替关卡
if (hit.transform.name == "wall")
{
//加载关卡,2 表示Build Settings中场景的索引
Application.LoadLevel();
}
} public void OnTriggerEnter(Collider other)
{ } }

下一篇想弄动画的剪切,因为美工给程序的动画是一个总体。我们需要把某一个动作。比如蹦跑,杀怪等单个动画弄出来播放,就像上面的

transform.animation.Play("attack");//攻击

unity3d-代码控制游戏角色控制器移动的更多相关文章

  1. Unity3D 之3D游戏角色控制器运动

    3D运动,绑定了人形控制器后的一个简单的运动方法. using UnityEngine; using System.Collections; public class PlayerMove : Mon ...

  2. [转]iOS之浅谈纯代码控制UIViewController视图控制器跳转界面的几种方法

    参考:http://www.mamicode.com/info-detail-469709.html 一.最普通的视图控制器UIViewContoller 一个普通的视图控制器一般只有模态跳转的功能( ...

  3. iOS之浅谈纯代码控制UIViewController视图控制器跳转界面的几种方法

    .最普通的视图控制器UIViewContoller 一个普通的视图控制器一般只有模态跳转的功能(ipad我不了解除外,这里只说iPhone),这个方法是所有视图控制器对象都可以用的,而实现这种功能,有 ...

  4. Unity 代码控制游戏对象是父物体的第多少个子对象

    一个canvas下的游戏对象,排列顺序越往下,渲染顺序就越靠后,就会覆盖在先前的图形上.也就是说,运行游戏后,物体的渲染顺序是一个一个计算的. Transform.SetSiblingIndex(in ...

  5. 游戏开发之在UE4中编写C++代码控制角色

    当你运行我们上次做完的项目,你可能会意识到我们移动的摄像机还是默认的那个摄像机,这个默认的摄像机可以自由飞翔.这一节,我们要使得开始的角色是我们的一个Avatar类的实例对象,并且使用键盘控制我们的角 ...

  6. unity3d角色控制器01

    参考出处貌似是雨松大神.如有侵权,立即删除. 需要导入包 ①将FirstPerson Controller拖拽入Hierarchy(层次视图)中.由于角色控制器是具有一定物理引擎的,所以一定要将它放在 ...

  7. 关于Unity中Mecanim动画的动画状态代码控制与代码生成动画控制器

    对于多量的.复杂的.有规律的控制器使用代码生成 动画状态代码控制 1:每个动画状态,比如进入状态,离开状态, 等都有可能需要代码来参与和处理,比如,进入这个动画单元后做哪些事情,来开这个动画单元后做哪 ...

  8. [原]Unity3D深入浅出 - 角色控制器(Character Controller)

    角色控制器主要用于第一人称和第三人称主角的控制,并不使用刚体物理效果. 添加角色控制器的方法:依次打开菜单栏中的Component - Physiscs - Character Controller ...

  9. Unity3D笔记 英保通六 角色控制器

    一.角色控制器 U3D有两种角色控制方式:Rigidbody刚体.角色控制器组件(胶囊体组件) 面试的题目中经常会遇到这个问题: CharacterController和Rigidbody的区别? 这 ...

随机推荐

  1. 运行里用\\加IP地址访问远程主机和用mstsc登录远程主机有什么区别??

    \\ip是访问共享:mstsc是直接远端控制主机 "\\加IP",只要是windows,除win9x外,默认系统自带共享服务,除非有防火墙,或者手工关闭lanmanserver & ...

  2. linux中使用ps -ef

    常操作linux系统的都会用到:ps -ef 命令,是一个非常强大的进程查看命令. 在训练模型中使用python,那么我会要看这个python相关的进程,可以使用如下命令”: ps -ef | fgr ...

  3. event.stopPropagation(),event.preventDefault()和return false的区别

    event.stopPropagation(),event.preventDefault()和return false的区别 1.event.stopPropagation()方法 这是阻止事件的冒泡 ...

  4. 使用flask写移动端API

    环境 python 3.7 使用pip 安装falsk pip3 install flask #!flask/bin/python from flask import Flask, jsonify, ...

  5. typedef define typedef可以使程序参数化,提高程序的可移植性。

    小结: 1. typedef并没有创建一个新类型,它只是为某个已存在的类型增加了一个新的名称而已: 2. typedef声明也没有证据新的语义:通过这种方式声明的变量与通过普通方式声明的变量具有完全相 ...

  6. int 存储大小 数组元素个数

    为了得到某个类型或某个变量在特定平台上的准确大小,您可以使用 sizeof 运算符.表达式 sizeof(type) 得到对象或类型的存储字节大小.下面的实例演示了获取 int 类型的大小: 实例 # ...

  7. PHP之Boolean

    Boolean布尔类型 这是最简单的类型.Boolean表达了真值,可以为true或者false. 语法 要指定一个布尔值,使用常量true或者false,两个都不区分大小写. 通常运算符所返回的Bo ...

  8. html select控件的jq操作

    html select控件的jq操作 1.判断select选项中 是否存在Value="paraValue"的Item $("#selectid option[@valu ...

  9. 解决pathForResource返回nil, 无法读取plist文件问题

    有很多人在设置plist文件的时候, 会发现读取不了plist文件里面的内容, 返回值为nil, 下面我们来解决一下这个问题. 首先我们打开工程并且按照下面的步骤来设置: 设置好后, 我们来写一段代码 ...

  10. 转:ActiveMQ的作用总结(应用场景及优势)

    原文地址: ActiveMQ的作用总结(应用场景及优势) 业务场景说明: 消息队列在大型电子商务类网站,如京东.淘宝.去哪儿等网站有着深入的应用, 队列的主要作用是消除高并发访问高峰,加快网站的响应速 ...