5.3 实例:设置脚本的权限和执行脚本

在运行shell脚本之前,要确保shell脚本具有可执行权限,否则当你执行运行脚本的时候,会得到“Permission denied”的错误信息,类似如下:

$ ./test.sh
-bash: ./test.sh:Perminission denied

如果遇到上述错误,就需要给脚本文件添加可执行的权限,使用chmod命令为当前用户给文件添加可执行权限:

$ chmod u+x ./test.sh

如果想要给所有用户添加可执行权限,则使用如下命令:

$ chmod +x ./test.sh

运行一个shell脚本,使用绝对路径或者相对路径两种方式均可以。
使用绝对路径运行shell脚本的方法类似如下:

$ /home/linux/Desktop/test.sh
This is a test!

使用相对路径运行shell脚本的方式类似如下:

$ cd /home/linux/Desktop
$ ./test.sh
This is a test!

也可以向运行一个命令一样运行一个shell脚本,即不需要指定绝对路径或相对路径,只需要输入脚本名称即可。要实现这一目的,需要将shell脚本所在目录的绝对路径添加到你的PATH环境变量中。例如,如果你编写的脚本均放置在“/home/linux/Desktop”下,那么我们就可以将路径“/home/linux/Desktop”添加到PATH变量中,那么我们就可以在任何路径下执行运行“/home/linux/Desktop”目录下的shell脚本。

$ export PATH=$PATH:/home/linux/Desktop
$ cd /tmp
$ ./test.sh
$ This is a test!
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是实现上述功能的详细步骤,绑定事件和脚本C#: 步骤1:创建NPC模型和场景 1.1 在Unity中创建一个新场景,将Pico Neo3连接到电脑上,并在场景中添加一个Pico Neo3预设体作为玩家的视角。 1.2 在场景中添加一个NPC模型,可以使用Unity自带的3D模型或导入自己的模型。 1.3 为NPC模型添加一个Collider组件,以便玩家可以与NPC交互。 步骤2:实现NPC自动带路到指定地点 2.1 选中NPC模型,在Inspector窗口中选择Navigation,勾选“Navigation Static”,然后点击“Bake”按钮,进行导航网格的烘焙。 2.2 在场景中添加一个空物体作为NPC的终点位置,将其命名为“EndPoint”。 2.3 在NPC的GameObject上添加NavMeshAgent组件,将“Destination”属性设置为“EndPoint”的位置。 2.4 在脚本中添加以下代码: ```csharp using UnityEngine; using UnityEngine.AI; public class NPCController : MonoBehaviour { public Transform endPoint; private NavMeshAgent agent; void Start() { agent = GetComponent<NavMeshAgent>(); agent.SetDestination(endPoint.position); } } ``` 2.5 将脚本挂载到NPC的GameObject上,并将“endPoint”属性设置为“EndPoint”的Transform组件。 步骤3:实现NPC口语交流 3.1 在场景中添加一个Canvas组件,并在其中添加一个Text组件作为NPC对话框的文本。 3.2 在脚本中添加以下代码: ```csharp using UnityEngine; using UnityEngine.UI; public class DialogueController : MonoBehaviour { public Text dialogueText; public Button confirmButton; private string[] dialogueLines; private int currentLineIndex = 0; void Start() { dialogueLines = new string[] { "Hello!", "How are you doing?", "Nice weather today.", "Have a good day!" }; dialogueText.text = dialogueLines[currentLineIndex]; confirmButton.onClick.AddListener(OnConfirmButtonClicked); } private void OnConfirmButtonClicked() { currentLineIndex++; if (currentLineIndex < dialogueLines.Length) { dialogueText.text = dialogueLines[currentLineIndex]; } else { gameObject.SetActive(false); } } } ``` 3.3 将脚本挂载到Canvas的GameObject上,并将“dialogueText”属性设置为NPC的对话框文本组件,“confirmButton”属性设置为NPC的确认按钮组件。 步骤4:实现UI交互和语音识别 4.1 在Canvas中添加一个Button组件作为录音按钮,添加一个Text组件作为录音状态的文本提示。 4.2 在脚本中添加以下代码: ```csharp using UnityEngine; using UnityEngine.UI; using UnityEngine.Windows.Speech; public class InteractionController : MonoBehaviour { public Button recordButton; public Text statusText; private bool isRecording = false; private DictationRecognizer dictationRecognizer; void Start() { recordButton.onClick.AddListener(OnRecordButtonClicked); } private void OnRecordButtonClicked() { if (!isRecording) { isRecording = true; statusText.text = "Recording..."; dictationRecognizer = new DictationRecognizer(); dictationRecognizer.DictationResult += OnDictationResult; dictationRecognizer.Start(); } else { isRecording = false; statusText.text = ""; dictationRecognizer.Stop(); dictationRecognizer.Dispose(); } } private void OnDictationResult(string text, ConfidenceLevel confidence) { Debug.Log("Dictation result: " + text); } } ``` 4.3 将脚本挂载到Canvas的GameObject上,并将“recordButton”属性设置为录音按钮组件,“statusText”属性设置为录音状态文本提示组件。 4.4 在NPC对话框的确认按钮的OnClick事件中添加以下代码: ```csharp GameObject interactionCanvas = Instantiate(Resources.Load<GameObject>("InteractionCanvas")); interactionCanvas.transform.SetParent(GameObject.Find("Canvas").transform, false); ``` 4.5 创建一个InteractionCanvas的Prefab,包含录音按钮和状态文本提示,将其放在Resources目录下。 步骤5:实现状态机控制 5.1 在脚本中添加以下代码: ```csharp public enum DialogueState { Idle, WaitingForConfirm, WaitingForRecording, WaitingForPlayback, End } public class StateMachine : MonoBehaviour { private DialogueState currentState = DialogueState.Idle; private NPCController npcController; private DialogueController dialogueController; private InteractionController interactionController; void Start() { npcController = GetComponent<NPCController>(); dialogueController = FindObjectOfType<DialogueController>(); } void Update() { switch (currentState) { case DialogueState.Idle: dialogueController.gameObject.SetActive(true); currentState = DialogueState.WaitingForConfirm; break; case DialogueState.WaitingForConfirm: if (dialogueController.gameObject.activeSelf == false) { currentState = DialogueState.Idle; } break; case DialogueState.WaitingForRecording: if (interactionController == null) { currentState = DialogueState.WaitingForPlayback; } break; case DialogueState.WaitingForPlayback: if (interactionController == null) { currentState = DialogueState.WaitingForConfirm; } break; case DialogueState.End: npcController.enabled = false; break; } } public void StartRecording() { interactionController = Instantiate(Resources.Load<GameObject>("InteractionCanvas")).GetComponent<InteractionController>(); currentState = DialogueState.WaitingForRecording; } public void EndRecording() { interactionController.gameObject.SetActive(false); interactionController = null; } public void StartNextLine() { currentState = DialogueState.WaitingForConfirm; } } ``` 5.2 在Canvas的录音按钮的OnClick事件中添加以下代码: ```csharp FindObjectOfType<StateMachine>().StartRecording(); ``` 5.3 在InteractionController的录音按钮的OnClick事件中添加以下代码: ```csharp if (isRecording) { OnDictationResult("User: " + text, confidence); FindObjectOfType<StateMachine>().EndRecording(); } ``` 5.4 在DialogueController的确认按钮的OnClick事件中添加以下代码: ```csharp switch (FindObjectOfType<StateMachine>().currentState) { case DialogueState.WaitingForConfirm: FindObjectOfType<StateMachine>().StartNextLine(); break; case DialogueState.WaitingForPlayback: FindObjectOfType<StateMachine>().StartNextLine(); break; case DialogueState.End: gameObject.SetActive(false); break; } ``` 5.5 在DialogueController的Start方法中添加以下代码: ```csharp FindObjectOfType<StateMachine>().currentState = DialogueState.Idle; ``` 5.6 在StateMachine的Start方法中添加以下代码: ```csharp interactionController = null; ``` 5.7 在DialogueController的OnEnable方法中添加以下代码: ```csharp if (FindObjectOfType<StateMachine>().currentState == DialogueState.End) { gameObject.SetActive(false); } ``` 5.8 在DialogueController的OnDisable方法中添加以下代码: ```csharp if (FindObjectOfType<StateMachine>().currentState == DialogueState.End) { FindObjectOfType<StateMachine>().npcController.enabled = true; } ``` 5.9 在DialogueController的OnDestroy方法中添加以下代码: ```csharp if (FindObjectOfType<StateMachine>().currentState == DialogueState.End) { FindObjectOfType<StateMachine>().npcController.enabled = true; } ``` 5.10 在StateMachine的OnDestroy方法中添加以下代码: ```csharp if (FindObjectOfType<StateMachine>().currentState == DialogueState.End) { FindObjectOfType<StateMachine>().npcController.enabled = true; } ``` 完成以上步骤后,就可以实现NPC自动带路和与玩家的口语交流了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值