unity3d-代码控制游戏角色控制器移动
先上一个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-代码控制游戏角色控制器移动的更多相关文章
- Unity3D 之3D游戏角色控制器运动
3D运动,绑定了人形控制器后的一个简单的运动方法. using UnityEngine; using System.Collections; public class PlayerMove : Mon ...
- [转]iOS之浅谈纯代码控制UIViewController视图控制器跳转界面的几种方法
参考:http://www.mamicode.com/info-detail-469709.html 一.最普通的视图控制器UIViewContoller 一个普通的视图控制器一般只有模态跳转的功能( ...
- iOS之浅谈纯代码控制UIViewController视图控制器跳转界面的几种方法
.最普通的视图控制器UIViewContoller 一个普通的视图控制器一般只有模态跳转的功能(ipad我不了解除外,这里只说iPhone),这个方法是所有视图控制器对象都可以用的,而实现这种功能,有 ...
- Unity 代码控制游戏对象是父物体的第多少个子对象
一个canvas下的游戏对象,排列顺序越往下,渲染顺序就越靠后,就会覆盖在先前的图形上.也就是说,运行游戏后,物体的渲染顺序是一个一个计算的. Transform.SetSiblingIndex(in ...
- 游戏开发之在UE4中编写C++代码控制角色
当你运行我们上次做完的项目,你可能会意识到我们移动的摄像机还是默认的那个摄像机,这个默认的摄像机可以自由飞翔.这一节,我们要使得开始的角色是我们的一个Avatar类的实例对象,并且使用键盘控制我们的角 ...
- unity3d角色控制器01
参考出处貌似是雨松大神.如有侵权,立即删除. 需要导入包 ①将FirstPerson Controller拖拽入Hierarchy(层次视图)中.由于角色控制器是具有一定物理引擎的,所以一定要将它放在 ...
- 关于Unity中Mecanim动画的动画状态代码控制与代码生成动画控制器
对于多量的.复杂的.有规律的控制器使用代码生成 动画状态代码控制 1:每个动画状态,比如进入状态,离开状态, 等都有可能需要代码来参与和处理,比如,进入这个动画单元后做哪些事情,来开这个动画单元后做哪 ...
- [原]Unity3D深入浅出 - 角色控制器(Character Controller)
角色控制器主要用于第一人称和第三人称主角的控制,并不使用刚体物理效果. 添加角色控制器的方法:依次打开菜单栏中的Component - Physiscs - Character Controller ...
- Unity3D笔记 英保通六 角色控制器
一.角色控制器 U3D有两种角色控制方式:Rigidbody刚体.角色控制器组件(胶囊体组件) 面试的题目中经常会遇到这个问题: CharacterController和Rigidbody的区别? 这 ...
随机推荐
- HDU 1002 - A + B Problem II - [高精度]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1002 Problem DescriptionI have a very simple problem ...
- [No0000CD]shell 中的单行注释和多行注释
1. 单行注释 众所周知,# 比如想要注释:echo “ni” # echo "ni" 2. 多行注释 法一: : << ! 语句1 语句2 语句3 语句4 ! 例如 ...
- windows hook 钩子
windows hook 钩子 场景: 1.打印机 Ctrl+P弹出支付窗口,付款成功后打印
- A crawler that sent a DELETE request to every resource it encountered
RESTful Web APIs_2013 The crawler simulates a very curious but not very picky human. Give it a URL t ...
- 2016年蓝桥杯省赛A组c++第4题(算法填空)
/* 排序在各种场合经常被用到. 快速排序是十分常用的高效率的算法. 其思想是:先选一个“标尺”, 用它把整个队列过一遍筛子, 以保证:其左边的元素都不大于它,其右边的元素都不小于它. 这样,排序问题 ...
- Excel使用
筛选 1.数据->取消\使用筛选; 边框 函数 1.使用函数的话需要设置单元格格式为常规;
- ANT入门&用ANT编译java项目
第一次接触ant是15年在无锡某软件公司实习时,当时的项目是由多个模块组成,开发分成模块开发的几个小组.为了提高开发效率,采用这种编译项目的方法. 最近接触到flex项目,采用eclipse自动编译的 ...
- LeetCode 821 Shortest Distance to a Character 解题报告
题目要求 Given a string S and a character C, return an array of integers representing the shortest dista ...
- gitee 使用
gitee 使用 首先在码云仓库创建对应的仓库 当你输入错误用户名和密码 需要清掉配置 git config --system --unset credential.helper 设置账号 git c ...
- 【PyQt5-Qt Designer】QLineEdit 文本输入
QLineEdit 文本输入 一.QlineEdit 基本方法 setAlignment() 按固定值方式对齐文本 Qt.AlignLeft:水平方向靠左对齐 Qt.AlignRight:水平方向靠右 ...