希望我的开发日志记录的经验越来越多,给以后得自己留个记录和参考,同时也能为广大的同样是想做unity独立开发者的朋友一些经验和参考,互相学习,互相进步!如果想合作的可以加我微信:wqm994,一起探讨unity引擎,在独立开发的道路上齐头并进!!
废话不多说,开始正题:
如何实现点击按钮弹出菜单栏?
实现方法:
再建一个Canvas,在这个Canvas上加入所有你想加的东西
然后加代码:
public Canvas canvas;
void Start()
{
canvas.enabled=false;
}
public void Click()
{
canvas.enabled=true;
}
将这个代码加到任意游戏物体上,然后就和普通的创建按钮点击事件操作一样了。
注意:回到unity后把Canvas关联上。
unity5.6版本的video组件,在通过代码控制它的时候,必须引用命名空间,即必须进行程序集引用:
using UnityEngine .Video ;(这是必须的)
控制视频的播放与暂停
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine .Video ;
public class bofang : MonoBehaviour {
public VideoPlayer vp;
// Use this for initialization
void Start () {
vp.Stop ();
}
// Update is called once per frame
void OnMouseDown () {
vp.Play ();
}
}
如何实例化发射炮弹?(变种:如何发射类似于英雄联盟中极地大乱斗中的雪球?)
public Rigidbody paodan;
public float speed=20f;
void Update()
{
if(Input.GetButtonDown(KeyCode.F)){
Rigidbody newpandan=Instantiate(pandan,transform.position,transform.rotation) as Rigidbody;
newpandan.velocity=transform.TransformDirection(new Vector3(0,0,speed));
}
}
如何每隔一段时间克隆一个呢?
public GameObject monster;//要克隆的游戏物体(必须要制作成预制)
public float jdtime = 5.0f;//每隔5秒克隆一个
private float nextgs = 0.0f;//游戏时长
void Start () {
}
void Update () {
if(Time .time >nextgs )//判断实际游戏时长是否大于游戏时长
{
nextgs = Time.time + jdtime;
GameObject newgs=Instantiate(monster,transform.position,transform.rotation) as GameObject ;
}
}
}
改变鼠标样式:
public Textrue2D mousetextrue;
void OnMouseOver()
{
Cursor.SetCursor(mousetextrue,Vector2.zero,CursorMode.Auto);
}
void OnMouseExit()
{
Cursor.SetCursor(null,Vector2.zero,CursorMode.Auto);
}
在脚本组件小齿轮图标下自定义菜单项:
[ContextMenu("XXXX")] //XXXX为菜单名字
void XXXX(){
}
如何制作光线投射,即发射射线来检测是否碰撞到物体?
void Update(){
RaycastHit hit;设置一个RaycastHit类型的变量。
if (Physics.Raycast(transform.position,transform.forword,hit,3)){//transform.position表示从此脚本所依附的游戏物体的位置发射射线;transform.forword表示射线的朝向和所依附的游戏物体一致
这里面即可写一些做什么事的代码
}
}
在当前物体的位置绘制图像等元素的函数:
void OnDrawGizmos()
{
XXXXXX
}
如何建立路点?在场景中摆好各个路点,并把“parent”和“Next”设置好。然后为每个路点(空物体)添加以下脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PathNode : MonoBehaviour {
public PathNode m_parent;//路点
public PathNode m_next;
public void SetNext(PathNode node){
if (m_next != null) {
m_next.m_parent = null;
}
m_next = node;
node.m_parent = this;
}
void OnDrawGizmos(){
Gizmos .DrawIcon (this .transform .position ,"timg.jpg");
}
}
如何让人物或者你需要的游戏物体沿着你架设的路点移动?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Enemy : MonoBehaviour {
public PathNode m_currentNode;
public float E_life = 15.0f;
public float max_life = 15.0f;
public float speed = 12.0f;
//public Enemy inst;
//void Start () {
//inst = this;
//}
void Update () {
RotateTo ();
MoveTo ();
}
public void RotateTo()
{
float current = transform.eulerAngles.y;
this.transform.LookAt (m_currentNode.transform);
Vector3 target = this.transform.eulerAngles;
float next = Mathf.MoveTowardsAngle (current, target.y, 120 * Time.deltaTime);
this.transform.eulerAngles = new Vector3 (0, next, 0);
}
public void MoveTo()
{
Vector3 pos1 = transform.position;
Vector3 pos2 = m_currentNode.transform.position;
float dist = Vector2.Distance (new Vector2 (pos1.x, pos1.z), new Vector2 (pos2.x, pos2.z));
if (dist < 1.0f) {
if (m_currentNode.m_next == null) {
Destroy (this.gameObject);
}else {m_currentNode = m_currentNode.m_next;}
}
transform.Translate (new Vector3 (0, 0 ,speed * Time.deltaTime));
}
}
如果好几个物体都需要用同一个代码,则可以使用下面的技巧(如,控制玩家的代码,但由于分敌我情况,但脚本都是一样的)
那么则可以这样做:
[Range(1, 2)]
这里则申请一个int型的变量,如
public int playernum=1;//初始时是玩家1
这样则可以在检视面板出现一个滑块,滑块的数字的多少由上面的中括号里的数字来定。
(注:[Range(1, 2)]只能用来控制它下面的一个变量,所以我们要把需要控制的变量写到下面,并且保证变量类型和上面的一致)
接着就可以在代码里面这样来做:
if(playernum==1)
{
//任何你想做的事
}
if(playernum==2)
{
//任何你想做的事
}
....
如何在安卓设备中播放视频:
using UnityEngine;
using System.Collections;
public class Test : MonoBehaviour {
//以下都为全屏播放
//必须将视频转换成MP4格式并且放到Assets/StreamingAssets文件夹下
public GUIStyle buttontype;
public Texture buttonzhanshi;
void OnGUI()
{
//if (GUI.Button(new Rect(40, 600, 68, 76), "播放"))//触屏后会取消播放
//{
// Handheld.PlayFullScreenMovie("GS.mp4", Color.black, FullScreenMovieControlMode.CancelOnInput);
//}
//if (GUI.Button(new Rect(20, 290, 200, 200), "全屏播放"))
//{
// Handheld.PlayFullScreenMovie("test.mp4", Color.black, FullScreenMovieControlMode.Full);
//}
//if (GUI.Button(new Rect(20, 500, 200, 200), "隐藏按钮控制器"))//隐藏控制器
//{
// Handheld.PlayFullScreenMovie("test.mp4", Color.black, FullScreenMovieControlMode.Hidden);
//}
if (GUI.Button(new Rect(30, 600, 100, 150), buttonzhanshi,buttontype ))
{
Handheld.PlayFullScreenMovie("GS.mp4", Color.black, FullScreenMovieControlMode.Minimal);
}
}
}
将脚本直接放到摄像机上即可。
怎么在Unity中实现划线效果呢?即通过鼠标来划线。代码如下:
public class DrawLineTest : MonoBehaviour {
private GameObject clone;
private LineRenderer line;
private int i;
public GameObject tf;
void Start () {
}
// Update is called once per frame
void Update () {
if (Input.GetMouseButtonDown(0))
{
clone = (GameObject)Instantiate(tf, tf.transform.position, transform.rotation);//克隆一个带有LineRender的物体
//clone.gameObject.GetComponent().enabled=false;
//clone.GetComponent().enabled=true;
line = clone.GetComponent();//获得该物体上的LineRender组件
line.SetColors(Color.blue, Color.red);//设置颜色
line.SetWidth(0.2f, 0.1f);//设置宽度
i = 0;
}
if (Input.GetMouseButton(0))
{
i++;
line.SetVertexCount(i);//设置顶点数
line.SetPosition(i - 1, Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 15)));//设置顶点位置
}
if (Input.GetMouseButtonUp (0)) {
line.enabled=false;
Destroy (clone, 1);
}
}
}
将此脚本挂载到摄像机上?并在工程面板里将tf游戏物体关联上,运行,就可以划线了!
未完待续.....